SLR 文法判定函数: judgeSLR() 代码解析
该代码是一个判断 SLR 文法是否正确的函数。下面对每一行进行详细分析:
-
public bool judgeSLR(): 定义一个公共的返回值为 bool 类型的函数,函数名为judgeSLR。 -
isLL_1_ isLL_1_ = isLR_0.isLL_1_;: 创建一个isLL_1_对象,用于存储isLR_0中的isLL_1_对象。 -
List<List<string>> back;: 创建一个二维字符串列表back,用于存储归约项的 FOLLOW 集。 -
List<string> put;: 创建一个字符串列表put,用于存储移进项的 FIRST 集。 -
foreach (var item in stateNumbers.Keys): 遍历stateNumbers字典中的所有键。 -
back = new List<List<string>>(); put = new List<string>();: 将back和put列表初始化为空。 -
foreach (var pro in item.items): 遍历item中的所有产生式。 -
if (pro.dotIndex == pro.RHS.Count): 如果当前产生式的点号位置等于右部的长度。 -
if(!pro.LHS.Equals(productions.Keys.First() + '')): 如果当前产生式的左部不是原始文法的增广符号。 -
back.Add(isLL_1_.follow.getfollows()[pro.LHS]);: 将当前产生式的左部的 FOLLOW 集添加到back列表中。 -
else if (terminals.Contains(pro.RHS[pro.dotIndex])): 如果当前产生式的点号后面是终结符。 -
put.Add(pro.RHS[pro.dotIndex]);: 将当前终结符添加到put列表中。 -
if (back.Count > 0 && put.Count > 0): 如果back和put列表中都有元素。 -
foreach(var item1 in back): 遍历back列表中的所有元素。 -
foreach(var item2 in put): 遍历put列表中的所有元素。 -
if(item1.Contains(item2))return false;: 如果当前 FOLLOW 集包含当前 FIRST 集中的元素,则返回 false。 -
if (back.Count >= 2): 如果back列表中的元素个数大于等于 2。 -
for (int i=0;i<back.Count-1;i++): 遍历back列表中的所有元素,除了最后一个元素。 -
for(int j = i+1; j < back.Count; j++): 遍历back列表中 i 位置后面的所有元素。 -
foreach(var item3 in back[i]): 遍历back列表中 i 位置的元素。 -
if (back[j].Contains(item3)) return false;: 如果back列表中 j 位置的元素包含当前元素,则返回 false。 -
return true;: 如果以上条件都不满足,则返回 true。
原文地址: http://www.cveoy.top/t/topic/f1SH 著作权归作者所有。请勿转载和采集!