【编译原理】语法分析LL(1)分析法的FIRST和FOLLOW集

  • 时间:
  • 浏览:1

求FIRST集的部分:

示例文件如下:(注:非终结符本应都用大写字母,原题用的是加在标的法律依据 ,如E′,但我用char型存每个符号,所以用的是相应的小写字母,如e)

与FIRST集相关的有几只辅助函数:

2. 感觉我的实现稍显冗杂,C++的集合操作不太会用(越来越找到原生的这个.addAll有一有有一个多的法律依据 ,所以是一些人用迭代器有一有有一个个加的),考完试用一些语言实现有一有有一个更简洁的。

剩余行:每行描述了有一有有一个非终结符的所有产生式,第有一有有一个字符为产生式头(非终结符),后跟有一有有一个整数位候选式的个数n,有一有有一个多是n个以空格分隔的字符串为产生式体。

运行结果(请忽略集合最后有一有有一个元素后的逗号。。。):

3. 有一有有一个多的算法用进程实现未必冗杂,日后 它规则比较多,且退出的条件是“集合不再增大”,手算起来一轮一轮的容易乱。祝我期末好运吧。

主函数的流程很简单,从文件读入指定格式的文法,日后 依次求文法的FIRST集、FOLLOW集

与FOLLOW集相关的有几只辅助函数:

注:

第一行:所有非终结符,无空格,第有一有有一个为有一有有一个多刚开始符号;

  教课书上的规则如下,用我理解的语言描述的:

  近来复习编译原理,语法分析中的自上而下LL(1)分析法,时需构造求出有一有有一个文法的FIRST和FOLLOW集,日后 构造分析表,利用分析表+有一有有一个栈来做自上而下的语法分析(递归下降/预测分析),有一有有一个多这个FIRST集合FOLLOW集看得我头大。。。

1. 语法分析的每个终结符号实际上代表有一有有一个单词,是从词法分析器获取的,这里为了冗杂问题所以只用了有一有有一个char型表示;而每个非终结符号则是有一有有一个语法单元,这里同样用char型表示了;

求FOLLOW集的部分

其中文法文件的数据格式为(按照平时做题的输入格式设计的):

第二行:所有终结符,无空格;

数据元素的定义:

老师和同学能很敏锐地求出来,而我不可以按照规则,像进程一样两根绳子 条执行。于是我把这个过程写成了进程,如下: