- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LL1 实验报告
1.设计原理
所谓 LL (1)分析法,就是指从左到右扫描输入串(源程序) ,同时采用最左推导,且
对每次直接推导只需向前看一个输入符号,便可确定当前所应当选择的规则。实现 LL (1)
分析的程序又称为 LL (1)分析程序或 LL1 (1)分析器。
我们知道一个文法要能进行 LL (1)分析,那么这个文法应该满足:无二义性,无左递
归,无左公因子。当文法满足条件后,再分别构造文法每个非终结符的 FIRST 和 FOLLOW
集合, 然后根据 FIRST 和 FOLLOW 集合构造 LL (1)分析表, 最后利用分析表, 根据 LL(1)
语法分析构造一个分析器。 LL (1)的语法分析程序包含了三个部分,总控程序,预测分析
表函数, 先进先出的语法分析栈, 本程序也是采用了同样的方法进行语法分析, 该程序是采
用了 C++ 语言来编写,其逻辑结构图如下:
LL (1)预测分析程序的总控程序在任何时候都是按 STACK 栈顶符号 X 和当前的输入
符号 a 做哪种过程的。对于任何( X ,a),总控程序每次都执行下述三种可能的动作之一:
(1)若 X = a = ‘#,则宣布分析成功,停止分析过程。’
(2)若 X = a ‘,则把# ’ X 从 STACK 栈顶弹出,让 a 指向下一个输入符号。
(3)若 X 是一个非终结符,则查看预测分析表 M 。若 M[A ,a] 中存放着关于 X 的一
个产生式,那么,首先把 X 弹出 STACK 栈顶,然后,把产生式的右部符号串按反序一一弹
出 STACK 栈(若右部符号为 ε,则不推什么东西进 STACK 栈)。若 M[A ,a] 中存放着 “出错
标志 ”,则调用出错诊断程序 ERROR 。
事实上, LL (1)的分析是根据文法构造的,它反映了相应文法所定义的语言的固定特
征,因此在 LL (1)分析器中,实际上是以 LL (1)分析表代替相应方法来进行分析的。
2.分析
LL ( 1) 分析表是一个二维表,它的表列符号是当前符号,包括文法所有的终结
和自定义。
的句子结束符号 #,它的表行符号是可能在文法符号栈 SYN 中出现的所有符号,
包括所有的非终结符,所有出现在产生式右侧且不在首位置的终结符, 自定义
的句子结束符号 #表项。
为当前栈符号与当前符号匹配后, 所要求的栈操作和输入操作。 表项表明了文法
的终结符与非终结符是否可能相遇。其中 , 栈操作包括两种,一是弹栈 ;二是
弹栈后,将符号串 ABc 反转后压栈 ;输 入 操作 包 括 两 种 ,一 是 读 入下
一符号,是保持当前符号不变。
具体的造算法为 171。
(1 ) 设 A , B 为文法的非终结符, C 为文法的终结符和非终结符组成的字符串,
a 为文法的终结符将所 有 产 生式分为四类 :6)A-aB ,则(A,a )项填写为 (B 调向
后压栈,读入下一个字符 ):(ii)A-a; A-a, 则将〔A, a) 项填写为 (弹栈,读入下一个
字符 ):(iii)A-BC ,则将(A,select(A-BC)) 项全部填写为 (将 BC 调向后压栈,保持
当前字符不读入 ):(iv)A-N ,则将 (A, follow(A)) 项全部填写为 (弹栈,保持当前字
符不读 )。
(2) 对表行和表列的所有字符进行循环;
(3) 如果当前表行
文档评论(0)