实验任务:
实现LR语法分析器
实验要求:
根据编译原理理论课教材中例3.22给出的算术表达式文法以及该文法的LR分析表,用C语言编写接受算术表达式为输入的语法分析器,以控制台(或文本文件,也可以结合词法分析器完成)为输入,控制台(或文件)输出产生式序列形式的分析结果。
实验内容:
教材中例3.22给出的算术表达式文法只有+、运算,对应的LR分析表也比较单一,为了编写接受算术表达式为输入的语法分析器,我将文法完善为下列文法,然后先在纸上写出LR(0)项目集规范族来构造LR分析表,再将其写入程序作为该文法的LR分析表。然后再依据使用分析表对输入符号串做分析的过程编写程序,使得用LR分析法对任意输入的符号串进行分析。
(1)E-> E+T
(2)E- >E-T
(3)E- >T
(3)T- >TF
(4)T- >T/F
(5)T- >F
(6)F- >(E)
(7)F- >i
主要代码:
运行示例:
实验小结:
1.在看教材中的例3.22时,对于一个算术表达式而言绝不止+、*符号,故例3.22的文法具有一定的局限性,所以我们可以将文法进行拓展,即终结符有±*/,涵盖算术表示式应有的所有运算符,在此基础上我们还需要构造LR(0)项目集规范族,以构造出LR分析表,在确定正确的情况下将其输入程序中以作分析。
2.与上一个实验构造LL(1)语法分析器作对比,有很多的不同之处,LL(1)文法与LR(0)或LR(1)文法的分析技术就是不同的,所以本实验在汲取上个实验部分相同点的基础上需要改变分析思路,这样才能构造出正确的分析过程。
源程序
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
/// 0 1 2 3 4 5 6 7 8 9 10
///表格数组 + - * / i ( ) # E T F
char