编译原理实验二 tiny文法的LL(1)分析
来源:互联网 发布:弹跳法术升级数据 编辑:程序博客网 时间:2024/04/29 19:48
通过LL(1)分析方法对tiny的文法进行处理,然后输入tiny程序,进行语法分析,其中也包含了词法扫描,词法扫描使用DFA状态图的循环扫描方法。
1、文法的规范化:消除文法中的左递归和提取文法的左公因子,并且对tiny的文法进行拆解,比如一条文法有几个选择,则拆成几条,最后的文法规则整理结果如下:
注:每条文法前面的标号是自行添加上去以便查看和分析,不属于程序处理范围。其中第0条文法中program为开始符号,’$’表示空推导,” -->”表示推导符号。
2、求出终结符号集和非终结符号集
扫描文法,求出终结符号集TerminalSet,非终结符号集NonTerminalSet。其中推导符号左边的token,全都属于非终结符号集,第一遍扫描可以求出非终结符号集。然后对文法推导符号右边的token进行扫描,消除掉属于非终结符号的token,剩下的token就都属于终结符号集。处理结果如下:
终结符号集:;if then end else repeat until identifier := read write < = + - * / % ( )number while do endwhile for to enddo downto
非终结符号集:programstmt-sequence stmt' statement if-stmt else-part' repeat-stmt assign-stmtread-stmt write-stmt exp cmp-exp' comparison-op simple-exp term' addop termfactor' mulop factor While-stmt Dowhile-stmt for-stmt for-choose'
3、求出first集合
first集合的求解算法伪代码自行google,具体实现见下面附件的代码。结果如下(其中字符’$’表示空推导):
4、求出follow集合
follow集合求解算法伪代码也自行google,结果如下(其中字符’#’表示输入的结束):
5、构造LL(1)分析表M[A,a]算法
文法规则的序号,见步骤1中的排序
6、分析算法,构造LL(1)分析树
为了在分析过程中构造分析树,除了分析栈,还要多开一个保存分析树节点的栈。
1)但分析栈中的栈顶元素和用户输入的token,值相等或类型匹配时,就把两个栈的栈顶元素出栈。
2)但进行文法规则的替换时,把两个栈的栈顶元素出栈,根据替换的文法规则,新建分析树节点(文法推导符号右部有多少个非终结符号/终结符号,就要建立多少个节点),然后这些新建节点作为刚才分析树栈中出栈token的子节点,连接好,之后再压入分析树节点的栈中。
3)栈顶元素是空推导时,则两个栈分析出栈,不做其他操作。
具体实现见代码。。。
7、文件cs的关系
共有3个类:父类Tiny,包含了tiny语言的特殊符号、保留字以及几个判断函数;子类TinyScan继承自Tiny,实现tiny的词法分析功能;子类SyntaxParse继承自Tiny,实现tiny的文法分析功能。
1)类Tiny的相关信息
2)类TinyScan的相关信息
3)类SyntaxParse的相关信息
代码文件:http://cid-780607117452312e.office.live.com/self.aspx/.Public/syntax%20parse.rar
- 编译原理实验二 tiny文法的LL(1)分析
- 编译原理LL(1)文法实验报告
- 编译原理实验4——LL(1)文法分析
- 编译原理(六) LL(1)文法分析法-分析过程
- 编译原理(五) LL(1)文法分析法(预测分析表的构造算法C++实现)
- 编译原理(六) LL(1)文法分析法(分析过程的C++实现)
- 编译原理(五) LL(1)文法分析法(预测分析表的构造算法C++实现)
- 编译原理(六) LL(1)文法分析法(分析过程的C++实现)
- 编译原理(五) LL(1)文法分析法-预测分析表的构造
- 编译原理-LL(1)文法笔记
- 编译原理LL(1)文法
- LL(1)的一个文法分析
- 编译原理:LL(1)文法 语法分析器(预测分析表法)
- 编译原理:LL(1)文法 语法分析器(预测分析表法)
- 【编译原理】LL(1)文法分析全过程(FIRST/FLLOW/SELECT集等)实现(c++语言)
- 编译原理-LL(1)预测分析实验 c源代码
- 编译原理的LL(1)分析过程,从求first和follow到建立预测分析表,再到文法分析
- 编译原理中LL(1)文法求FIRST集和FOLLOW集的方法
- 设计模式之java接口和java抽象类
- c/c++头文件
- ubuntu man手册不全
- js Tree
- insert all 的好处
- 编译原理实验二 tiny文法的LL(1)分析
- IDR_MAINFRAME字符串资源中各子串的含义
- Unix/Linux installation in disk, without cdrom.
- 存储过程,游标,循环,临时表
- Webuilder 全新发布-- 开发网站的新利器
- WIFEXITED WEXITSTATUS WIFSIGNALED
- 跟我一起写 Makefile
- "abcd"->"dcba"
- 在mac osx中vim可以使用系统剪贴板了