【编译原理】LR(1)分析法:C/C++实现
🔖墨香寄清辞:空谷幽篁风动,梦中仙鹤月明。 辗转千秋豪情在,乘风翱翔志不移。
目录
1. 编译原理之LR(1)分析法概念
1.1 编译原理
1.2 LR(1)分析法
2. 逆波兰式的产生及计算
2.1 实验目的
2.2 实验要求
2.3.1 算法流程图
2.3.2 参考程序代码
2.3 实验内容
2.3.1 实验解决代码
2.3.2 程序解释
2. 实验心得
1. 编译原理之LR(1)分析法概念
1.1 编译原理
编译原理是计算机科学领域的一个重要分支,它研究如何将高级编程语言的源代码转化成计算机能够执行的机器代码或中间代码的过程。编译原理涵盖了编译器的设计和实现,其中编译器是一种将源代码翻译成目标代码的软件工具。编译器的主要任务包括语法分析、词法分析、语义分析、优化和代码生成等环节。
1.2 LR(1)分析法
LR(1)(Left-to-Right, Rightmost derivation with 1 symbol lookahead)分析法是一种用于构建分析器的语法分析方法,通常用于分析上下文无关文法的语法结构,属于LR分析法的一种变种。它是一种强大的自底向上语法分析方法,适用于具有一定复杂性的上下文无关文法,通过使用向前查看符号来处理文法中的二义性,使得可以更精确地分析和理解输入。
🔥资源获取:关注公众号【科创视野】回复 LR分析法源码
2. 逆波兰式的产生及计算
2.1 实验目的
(1)构造LR(1)分析程序,并进行语法分析,判断给出的符号串是否为该文法识别的句子;
(2)了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。
2.2 实验要求
1.对下列文法,用LR(1)分析法对任意输入的符号串进行分析:
(0)E->S
(1)S->BB
(2)B->aB
(3)B->b
2.LR(1)分析表为:
(1)若输入
baba#
则输出为:
(2)若输入
bb#
则输出为:
2.3.1 算法流程图
2.3.2 参考程序代码
参考代码(不完整):
/* ACTION表*/ char *action[10][3]={"S3#","S4#",NULL, NULL,NULL,"acc", "S6#","S7#",NULL, "S3#","S4#",NULL, "r3#","r3#",NULL, NULL,NULL,"r1#", "S6#","S7#",NULL, NULL,NULL,"r3#", "r2#","r2#",NULL, NULL,NULL,"r2#"}; /* GOTO表*/ int goto1[10][2]={1,2, 0,0, 0,5, 0,8, 0,0, 0,0, 0,9, 0,0, 0,0, 0,0}; char vt[3]={'a','b','#'}; /*存放终结符*/ char vn[2]={'S','B'}; /*存放非终结符*/ char *LR[4]={"E->S#","S->BB#","B->aB#","B->b#"}; /*存放产生式*/ /*输出状态栈、输出符号栈、输出输入串*/ do{ y=z;m=0;n=0; /*y,z指向状态栈栈顶*/ g=top;j=0;k=0; x=c[top]; count++; printf("%d\t",count); while(m