语法分析的任务:
分析一个文法的句子的结构
语法分析器的功能:
按照文法的产生式(语言的语法规则) , 识别输入符号串是否为一个句子(合式程序)
语法分析器在编译原理中占主导地位

语法分析大概分为两类:
- 自下而上(Bottom-up)
- 从输入串开始,逐步进行归约,直到文法的开始符号
- 归约:根据文法的产生式规则,把串中出现的产生式的右部替换成左部符号
- 从树叶节点开始,构造语法树算符优先分析法、LR分析法
- 自上而下(Top-down)
- 从文法的开始符号出发,反复使用各种产生式,寻找"匹配"的推导
- 推导:根据文法的产生式规则,把串中出现的产生式的左部符号替换成右部
- 从树的根开始,构造语法树
- 递归下降分析法、预测分析程序
自上而下(Top-down)
假定有文法G(S):
(1) S->xAy
(2) A->**|*
分析输入串x*y(记为a)。
大致流程:
当 语法分析器 调用 词法分析器获取x,S无法匹配,生成第一层语法树xAy,此时x匹配成功。
继续调用词法分析器获取*,A无法匹配,生成第二层语法树**,此时*能匹配成功,但是下一个*无法匹配,回溯到A,生成第二层语法树*,此时*匹配成功。
最后调用词法分析器获取y,直接匹配成功。
从上一个问题我们能看到多个产生式候选带来的回溯问题:
- 分析过程中,当一个非终结符用某一个候选匹配成功时,这种匹配可能是暂时的
- 出错时,不得不“回溯’
除了回溯问题还有文法左递归问题:
一个文法是含有左递归的,如果存在非终结符P,如图:

当我们要匹配a时,图中式子会产生无穷个子树,形成死循环。
消除文法左递归问题
1.直接左递归的消除
- 见诸于产生式中的直接左递归:P→Pa |β (β不以P开头)
- 左递归变右递归
- P→βP’
- P’→aP’|ε
- 推导得它们最终产生的句子都是βa…a
- 推广到:P-→Pa1| Pa2|… Pam|β1| β2|…|βn 则有:
- P→β1|P’| β2P’…| β~n ~P’
- P’→a1P’|a2P’|…| amP’| ε
2.间接左递归的消除
给定文法G(S):
S→Qc|c
Q→Rb|b
R→Sa|a
事实上S、Q、R都是左递归,如S=>Qc=>Rbc=>Sabc
间接左递归的消除
- 一个文法消除左递归的条件
- 不含以ε为右部的产生式
- 不含回路即:P最终推出 P
通过图中推导:

文法G(S)最终变为了直接左递归,最后用直接左递归的消除,消除左递归。

消除回溯
为了消除回溯必须保证
对文法的任何非终结符,当要它去匹配输入串时,能够根据它所面临的输入符号准确地指派它的一个候选去执行任务,并且此候选的工作结果应是确信无疑的。
这里引入一个新概念:


为了尽量让首符集两两不相交:


LL(1)文法
构造不带回溯的自.上而下分析的文法条件
1.文法不含左递归
2.对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。 即,若
A→a 1|a 2…|an
则FIRST(ai)∩FIRST(aj)=Ø (i≠j)
3.对文法中的每个非终结符A ,若它存在某个候选首符集包含ε,则
FIRST(a i)∩FOLLOW(A)=Ø ;i=1,2…n
如果一个文法G满足以上条件,则称该文法G为LL(1)文法。
第一个L:从左到右扫描输入串
第二个L:最左推导
1:每一步只需向前查看一个单词符号

FIRST集合算法:

FOLLOW集合算法:



本文介绍了编译原理中的语法分析,重点讨论了自上而下的方法,包括消除文法左递归和回溯的问题。自上而下分析包括递归下降和预测分析,但可能遇到回溯和左递归问题。通过消除直接和间接左递归,以及构造LL(1)文法来避免回溯,确保语法分析过程高效且无误。
2747

被折叠的 条评论
为什么被折叠?



