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

modify main.c

上级 df671197
没有这种文件类型的预览
...@@ -150,10 +150,52 @@ void First(const Rule* pHead, SetList* pFirstSetList) ...@@ -150,10 +150,52 @@ void First(const Rule* pHead, SetList* pFirstSetList)
int isChange; // 集合是否被修改的标志 int isChange; // 集合是否被修改的标志
RuleSymbol* pSymbol;// Symbol 游标 RuleSymbol* pSymbol;// Symbol 游标
// 使用文法链表初始化 First 集合
for(pRule = pHead; pRule != NULL; pRule = pRule->pNextRule)
{
AddOneSet(pFirstSetList, pRule->RuleName);
}
// do
// TODO: 在此添加代码 {
// isChange = 0; // 设置修改标志
for(pRule = pHead; pRule != NULL; pRule = pRule->pNextRule)
{
// 根据文法名称在 pFirstSetList 中查找 Set
Set* pDesSet = GetSet(pFirstSetList, pRule->RuleName);
int hasVoid = 1; // First 集合中是否含有ε的标志
for(pSymbol = pRule->pFirstSymbol; pSymbol != NULL && hasVoid; pSymbol = pSymbol->pNextSymbol)
{
if(pSymbol->isToken) // 终结符
{
// 调用 AddTerminalToSet 函数将终结符添加到 pDesSet,并设置修改标志
if(AddTerminalToSet(pDesSet, pSymbol->SymbolName))
isChange = 1;
hasVoid = 0; // 设置 First 集合中是否含有ε的标志
}
else // 非终结符
{
// 根据非终结符名称在 pFirstSetList 中查找 Set
Set* pSrcSet = GetSet(pFirstSetList, pSymbol->SymbolName);
// 调用 AddSetToSet 函数,将源 Set 中的所有终结符添加到目标 Set 中,并设置修改标志
if(AddSetToSet(pDesSet, pSrcSet))
isChange = 1;
// 调用 SetHasVoid 函数,判断源 Set 中是否含有ε
hasVoid = SetHasVoid(pSrcSet);
}
}
if(hasVoid)
{
// 调用 AddTerminalToSet 函数将ε加入到目标集合中
AddTerminalToSet(pDesSet, VoidSymbol);
}
}
} while(isChange);
} }
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论