作者:Andrew W.Appel,with Jens Palsberg
中文名:现代编译原理-C语言描述
现在又有了其它两个语言的版本
Modern Compiler Implementation in JAVA
Modern Compiler Implementation in ML
语法分析
1、LL(k)文法: (用于递归下降分析器。进行自顶向下的语法分析。方法是计算出非终结符的FIRST、FELLOW集,建立预测分析表。左递归消除是必须的)
第一个L表示从左到右扫描
第二个L表示最左推导
k表示最多向前使用几个token
LL(0)文法
S --> A
A --> + ID ID
ID --> a
该文法的推导过程不需要知道下一个token就能确定使用哪一个产生式进行推导
示例 +aa 的推导过程
S->A ---> + IDID --> +aID --> +ab
LL(1)文法
产生式一: S --> A | B
产生式二: A --> + ID ID
产生式三: B --> - ID ID
产生式四 : ID --> a | b
示例 a+b 的推导过程 中 只需要向后搜索一个token 就能判断出来使用产生式三还是产生式四进行推导
预测分析表:
预测分析表,罗列出在识别
完整示例
文法:- S->AB
A->CD
B->+AB|-AB |ε
C->ID|num|(S)
D->*CD| /CD |ε
构造预测分析表:(如果一个格内有两个产生式,那么就不是LL(1)文法
ID
num
(
)
+
-
*
/
#
S
S->AB
S->AB
S->AB
A
A->CD
A->CD
A->CD
B
B->ε
B->+AB
B->-AB
B->ε
C
C->ID
C->num
C->(S)
D
D->ε
D->ε
D->ε
D->*CD
D->/CD
D->ε
LR(k)
LR(0):每个状态(LR(0)项集)要么只包含归约,要么只包含移进,不用向前看token就知道是应该进行归约还是进行移进。