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

modify main.c

上级 7b7c43bb
......@@ -180,9 +180,73 @@ void Follow(const Rule* pHead, SetList* pFollowSetList, SetList* pFirstSetList)
// 调用 First 函数求文法的 First 集合
First(pHead, pFirstSetList);
//
// TODO: 在此添加代码
//
// 使用文法链表初始化 Follow 集合
for(pRule = pHead; pRule != NULL; pRule = pRule->pNextRule)
{
AddOneSet(pFollowSetList, pRule->RuleName);
}
// 在开始符号的 Follow 集合中加入终结符 $
AddTerminalToSet(&pFollowSetList->Sets[0], DollarSymbol);
do
{
isChange = 0; // 设置集合修改标志
for(pRule = pHead; pRule != NULL; pRule = pRule->pNextRule)
{
for(pSymbol = pRule->pFirstSymbol; pSymbol != NULL; pSymbol = pSymbol->pNextSymbol)
{
// 忽略终结符
if(pSymbol->isToken)
continue;
// 初始化一个 First 集合 TempFirstSet,作为临时变量
Set TempFirstSet;
TempFirstSet.nTerminalCount = 0;
if(NULL != pSymbol->pNextSymbol)
{
if(pSymbol->pNextSymbol->isToken) // 终结符
{
// 调用 AddTerminalToSet 函数将该终结符加入到 TempFirstSet
AddTerminalToSet(&TempFirstSet, pSymbol->pNextSymbol->SymbolName);
}
else // 非终结符
{
// 调用 GetSet 函数在 pFirstSetList 中查找 Set
Set* pFirstSetXn = GetSet(pFirstSetList, pSymbol->pNextSymbol->SymbolName);
// 将找到的 Set 加入 TempFirstSet 中
AddSetToSet(&TempFirstSet, pFirstSetXn);
}
}
else
{
// 调用 AddTerminalToSet 函数将 VoidSymbol 加入到 TempFirstSet 中
AddTerminalToSet(&TempFirstSet, VoidSymbol);
}
// 调用 GetSet 函数在 pFollowSetList 中查找 Set
Set* pFollowSetXi = GetSet(pFollowSetList, pSymbol->SymbolName);
// 将集合 TempFirstSet 加入 pFollowSetXi
if(AddSetToSet(pFollowSetXi, &TempFirstSet))
isChange = 1; // 设置集合修改标志
if(SetHasVoid(&TempFirstSet)) // 判断集合 TempFirstSet 是否含有ε
{
// 调用 GetSet 函数得到当前文法名称对应的 Follow 集合
Set* pFollowSetA = GetSet(pFollowSetList, pRule->RuleName);
// 将集合 pFollowSetA 加入 pFollowSetXi
if(AddSetToSet(pFollowSetXi, pFollowSetA))
isChange = 1; // 设置集合修改标志
}
}
}
} while(isChange);
}
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论