- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
语法分析器的功能
自上而下分析面临的问题
LL(1)分析法
递归下降分析程序构造
预测分析程序
LL(1)分析中的错误处理
第四章 语法分析- 自上而下分析
4.1
4.2 4.3 4.4 4.5 4.6
• 功能定义:
– 按照文法产生式,识别输入符号串是否为一个句子。
• 技术路线:
– 是否能从文法的开始符号出发推导出这个输入串。 或者,建立一颗与输入串相匹配的语法分析树。
• 策略:
– 自上而下分析法,自下而上分析法。
4.1 语法分析器的功能
图4.1语法分析器在编译程序中的地位
ä接收词法分析器输出的记号串,检查是否合乎语法。
ä报告语法错误,并恢复语法错误,从而可以继续分析。
ä输出是分析树的某种形式。
ä分析时其它任务:将各种记号的信息收入符号表、类型检 查和其它语义检查、中间代码的生成,这些放在“前端的其 它部分”完成。
(4)调整输入串指示器IP与叶结点进行匹配。
(5)如果为非终结符,用A的下一个产生式构建子树。
(6)如果匹配成功则结束;否则,回溯到步骤(4)。
x A y
*
x A
* *
x A y
S
S
S
y
• 自上而下分析法的缺点:
–是文法的左递归性问题。一个文法是含有左递归 的自上而下的分析过程陷入无限循环。如P介P 。
– 由于有回溯,就会产生一大堆麻烦事情。
–在上述的自上而下分析过程中,当一个非终结符 用某一候选匹配成功时,这种成功可能仅是暂时 的。这种虚假现象,我们需要更复杂的回溯技术。 一般说,要消除虚假匹配是很困难的。
– 当最终报告分析不成功时,我们不知道输入串中 出错的确切位置。
4.3.1 左递归的消除
4.3.2 消除回溯、提左因子
4.3.3 LL(1)分析条件
4.3 LL(1)分析法
• 一个反例:
– 文法: S个Qc|c ;Q个Rb|b;R个Sa|a虽然不是直接 左递归,但S 、Q 、R都是左递归。
• 消除左递归算法:
– 算法的思想是:
• 首先构造直接左递归;
• 再利用一般转换规则,消除直接左递归
• 化简文法。
• 下面算法在不含P介P ,也不含“在右部产生式时可以消除 左递归。
• 消除一个文法的左递归算法:
(1) 把文法 G 的所有非终结符按任一种顺利排列成 P1 …Pn ;按此顺序执行;
(2) FOR i:=1 TO n DO
BEGIN
FOR j:=1 TO i- 1 DO
把形如Pj+1 →Pj 的规则改写成
Pj+1 6 1 |6 1 | …6k | 。 其中Pj 6 1 |6 1 | …6k 是关于Pj 的
所有规则;
消除关于Pi规则的直接左递归性。
END
化简由(2)所得的文法。即去除那些从开始符号出发永 远无法到达的非终结符的产生规则。
• 例子4.3:
– 对4.3文法,它的非终结符排序为R,Q,S。把R代入 Q ,Q代入S得到: S Sabc|abc|bc|c
– 消除左递归后得到: S abcS’ |bcS’ |cS’ S’ abcS’ | Q Sab|ab|b(化简消去) R Sa|a (化简后消去)
– 对不同的排列,会有不同形式的无左递归文法, 但它们等价。
• 提取公共左因子算法:
A 6 1 |6 2 | … |6 n | 1 | 2 | … | m(其中每个 不以6开头)
那么可以把这些规则改写成:
A 6A’| 1 | 2 | … | m A’ 1 | 2 | … | n
• 例4.4
• 上述算法的不足:
– 当非终结符A面临输入符号a,且a不属于A的任意候 选首符集,但A的某个候选首符集包c含时,就一定 可以使A自动匹配。这是一种错误。
• 定义FOLLOW(A) 集合:
– 假定S是文法G的开始符号,对于G的任何非终结符 A,我们定义
FOLLOW(A)={a|S⇒* …Aa…,a=VT }
若S⇒* …A,则规定# =FOLLOW(A)。
• LL(1)文法的充分必要条件:
– 文法不含左递归。
–
原创力文档


文档评论(0)