public bool judgeSLR isLL_1_ isLL_1_ = isLR_0isLL_1_; ListListstring back; Liststring put; foreach var item in stateNumbersKeys
该代码是一个判断SLR文法是否正确的函数。下面对每一行进行详细分析:
-
public bool judgeSLR():定义一个公共的返回值为bool类型的函数,函数名为judgeSLR。
-
isLL_1_ isLL_1_ = isLR_0.isLL_1_;:创建一个isLL_1_对象,用于存储isLR_0中的isLL_1_对象。
-
List<List
> back;:创建一个二维字符串列表back,用于存储归约项的FOLLOW集。 -
List
put;:创建一个字符串列表put,用于存储移进项的FIRST集。 -
foreach (var item in stateNumbers.Keys):遍历stateNumbers字典中的所有键。
-
back = new List<List
>(); put = new List ();:将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
原文地址: https://www.cveoy.top/t/topic/hrpT 著作权归作者所有。请勿转载和采集!