该代码是一个判断 SLR 文法是否正确的函数。下面对每一行进行详细分析:

  1. public bool judgeSLR(): 定义一个公共的返回值为 bool 类型的函数,函数名为 judgeSLR

  2. isLL_1_ isLL_1_ = isLR_0.isLL_1_;: 创建一个 isLL_1_ 对象,用于存储 isLR_0 中的 isLL_1_ 对象。

  3. List<List<string>> back;: 创建一个二维字符串列表 back,用于存储归约项的 FOLLOW 集。

  4. List<string> put;: 创建一个字符串列表 put,用于存储移进项的 FIRST 集。

  5. foreach (var item in stateNumbers.Keys): 遍历 stateNumbers 字典中的所有键。

  6. back = new List<List<string>>(); put = new List<string>();: 将 backput 列表初始化为空。

  7. foreach (var pro in item.items): 遍历 item 中的所有产生式。

  8. if (pro.dotIndex == pro.RHS.Count): 如果当前产生式的点号位置等于右部的长度。

  9. if(!pro.LHS.Equals(productions.Keys.First() + '')): 如果当前产生式的左部不是原始文法的增广符号。

  10. back.Add(isLL_1_.follow.getfollows()[pro.LHS]);: 将当前产生式的左部的 FOLLOW 集添加到 back 列表中。

  11. else if (terminals.Contains(pro.RHS[pro.dotIndex])): 如果当前产生式的点号后面是终结符。

  12. put.Add(pro.RHS[pro.dotIndex]);: 将当前终结符添加到 put 列表中。

  13. if (back.Count > 0 && put.Count > 0): 如果 backput 列表中都有元素。

  14. foreach(var item1 in back): 遍历 back 列表中的所有元素。

  15. foreach(var item2 in put): 遍历 put 列表中的所有元素。

  16. if(item1.Contains(item2))return false;: 如果当前 FOLLOW 集包含当前 FIRST 集中的元素,则返回 false。

  17. if (back.Count >= 2): 如果 back 列表中的元素个数大于等于 2。

  18. for (int i=0;i<back.Count-1;i++): 遍历 back 列表中的所有元素,除了最后一个元素。

  19. for(int j = i+1; j < back.Count; j++): 遍历 back 列表中 i 位置后面的所有元素。

  20. foreach(var item3 in back[i]): 遍历 back 列表中 i 位置的元素。

  21. if (back[j].Contains(item3)) return false;: 如果 back 列表中 j 位置的元素包含当前元素,则返回 false。

  22. return true;: 如果以上条件都不满足,则返回 true。

SLR 文法判定函数: judgeSLR() 代码解析

原文地址: http://www.cveoy.top/t/topic/f1SH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录