提交 c7fb0ab0 创建 作者: 宋海霞's avatar 宋海霞

modify main.c

上级 2e252480
...@@ -207,10 +207,83 @@ void RemoveLeftRecursion(Rule* pHead) ...@@ -207,10 +207,83 @@ void RemoveLeftRecursion(Rule* pHead)
int isChange; // Rule 是否被替换的标记 int isChange; // Rule 是否被替换的标记
RuleSymbol **pSelectPrePtr; // Symbol 指针的指针 RuleSymbol **pSelectPrePtr; // Symbol 指针的指针
// for(pRule = pHead; pRule != NULL; pRule = pRule->pNextRule)
// TODO: 在此添加代码 {
// //
// 替换
//
do
{
isChange = 0;
// 在 Rule 的所有 Select 中查找是否需要替换
for(pSelect = pRule->pFirstSymbol, pSelectPrePtr = &pRule->pFirstSymbol;
pSelect != NULL;
pSelectPrePtr = &pSelect->pOther, pSelect = pSelect->pOther)
{
if(SymbolNeedReplace(pRule, pSelect)) // 判断 Select 的第一个 Symbol 是否需要替换
{
isChange = 1;
// 调用 ReplaceSelect 函数,替换 Select 的第一个 Symbol 后得到新的 Selects
RuleSymbol* pNewSelects = ReplaceSelect(pSelect);
// 使用新的 Selects 替换原有的 Select,并调用 FreeSelect 函数释放原有的 Select 内存
//
// TODO: 在此添加代码
//
break;
}
if(isChange)
break;
}
}while(isChange);
// 忽略没有左递归的 Rule;
if(!RuleHasLeftRecursion(pRule))
continue;
//
// 消除左递归
//
pNewRule = CreateRule(pHead->RuleName); // 创建新 Rule
strcat(pNewRule->RuleName, Postfix);
pSelect = pRule->pFirstSymbol; // 初始化 Select 游标
pSelectPrePtr = &pRule->pFirstSymbol;
while(pSelect != NULL) // 循环处理所有的 Select
{
if(0 == pSelect->isToken && pSelect->pRule == pRule) // Select 存在左递归
{
// 移除包含左递归的 Select,将其转换为右递归后添加到新 Rule 的末尾,并移动游标
//
// TODO: 在此添加代码
//
}
else // Select 不存在左递归
{
// 在没有左递归的 Select 末尾添加指向新 Rule 的非终结符,并移动游标
//
// TODO: 在此添加代码
//
}
}
// 在新 Rule 的最后加入ε(用 '$' 代替)
// 将新 Rule 插入文法链表
//
// TODO: 在此添加代码
//
pRule = pNewRule;
}
} }
/* /*
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论