该代码是一个判断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> back;:创建一个二维字符串列表back,用于存储归约项的FOLLOW集。

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

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

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

  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):如果back和put列表中都有元素。

  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

public bool judgeSLR isLL_1_ isLL_1_ = isLR_0isLL_1_; ListListstring back; Liststring put; foreach var item in stateNumbersKeys

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

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