代码1是一个用于检查LR(0)文法输入是否符合规范的函数。具体步骤如下:

  1. 获取输入的字符串str。
  2. 判断字符串是否为空,如果为空则弹出提示框并返回。
  3. 声明一个空字符串temp和一个计数器i。
  4. 进入一个while循环,循环条件是i小于字符串长度。
  5. 在循环内部,将temp重置为空字符串。
  6. 进入另一个while循环,循环条件是i小于字符串长度且当前字符不是回车或换行符。
  7. 如果当前字符不是空格,则将其加入temp字符串。
  8. 计数器i加1。
  9. 退出内部while循环。
  10. 计数器i加1。
  11. 判断temp字符串是否以“|”结尾,如果是则弹出提示框并返回。
  12. 如果temp字符串长度大于3,则进入if语句。
  13. 判断temp字符串的第一个字符是否为大写字母,如果不是则弹出提示框并返回。
  14. 判断temp字符串的第二个和第三个字符是否分别为“-”和“>”,如果不是则弹出提示框并返回。
  15. 如果temp字符串长度小于等于3且大于0,则弹出提示框并返回。
  16. 退出外部while循环。
  17. 弹出提示框,提示输入的是正确的LR(0)文法。
  18. 启用三个按钮button4、button5、button6。

代码2是一个LR(0)语法分析器的核心函数,用于构建LR分析表。具体步骤如下:

  1. 声明一个Table类型的变量tnode,用于存储状态信息。
  2. 声明一个二维Table数组LRAna,用于存储LR分析表。
  3. 初始化LRAna数组,将每个元素都赋值为tnode。
  4. 将tnode赋值为一个包含字符'A'和数字0的Table对象。
  5. 将tnode赋值给LRAna[1][FindID(Echar, '#')],即在状态1和终结符'#'的交叉处添加一个接受状态acc。
  6. 进入一个for循环,循环次数为Gy_itemset的长度。
  7. 在循环内部,将tnode赋值为一个包含字符'r'和LRobjNum[proitemset[Gy_itemset[i]].Container[0]]的Table对象,其中LRobjNum[proitemset[Gy_itemset[i]].Container[0]]表示归约项目的原产生式序号。
  8. 进入另一个for循环,循环次数为Echar的长度。
  9. 在循环内部,将tnode赋值给LRAna[Gy_itemset[i]][j],即在状态Gy_itemset[i]和终结符Echar[j]的交叉处添加一个状态r。
  10. 进入一个for循环,循环次数为Pindex,即DFA状态数。
  11. 在循环内部,判断当前状态的符号是否为非终结符。
  12. 如果是非终结符,则将其对应的ID和Echar的长度相加,得到在LRAna数组中的位置,将tnode赋值给该位置。
  13. 如果不是归约项目,则将其对应的ID作为Echar数组中的位置,将tnode赋值给该位置。
  14. 完成LR分析表的构建
代码1:1private void button2_Clickobject sender EventArgs e2 3 string str = richTextBox1Text;4 if strLength == 05 6 MessageBoxShow输入为空;7

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

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