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

  • 时间:
  • 浏览:2
  • 来源:彩神欢乐生肖_神彩欢乐生肖官方

与FOLLOW集相关的2个辅助函数:

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

数据元素的定义:

与FIRST集相关的2个辅助函数:

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

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

求FOLLOW集的每段

求FIRST集的每段:

注:

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

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

2. 感觉我的实现稍显复杂性,C++的集合操作不太会用(那么 找到原生的之类.addAll原本的法律最好的法子,好多好多 是好多好多 人用迭代器一个个加的),考完试用好多好多 语言实现一个更简洁的。

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

3. 原本的算法用任务管理器实现无须复杂性,否则 它规则比较多,且退出的条件是“集合不再增大”,手算起来一轮一轮的容易乱。祝我期末好运吧。

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

  近来复习编译原理,语法分析中的自上而下LL(1)分析法,都要构造求出一个文法的FIRST和FOLLOW集,否则 构造分析表,利用分析表+一个栈来做自上而下的语法分析(递归下降/预测分析),原本之类 FIRST集合FOLLOW集看得我头大。。。

老师和同学能很敏锐地求出来,而我必须按照规则,像任务管理器一样每根绳子 条执行。于是我把之类 过程写成了任务管理器,如下:

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

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