语法分析的java代码 语法分析 算法_归约

记录了第三章老师上课提问到的问题。


语法分析的java代码 语法分析 算法_句柄_02

语法分析重要概念和算法

LL(1)文法

定义:要想不出现回溯,需要文法的任何两个产生式 A → α|β 都满足下面两个条件
(1)FIRST(α)∩ FIRST(β)= Ø;
(2)若 β⇒*ε ,那么 FIRST(α)∩ FOLLOW(A)= Ø。
把满足这两个条件的文法称为LL(1)文法。其中第一个“L”表示从左往右扫描输入,二个“L”表示产生最左推导,“1”表示在决定分析器的每步动作时需要向前查看向前查看下一个输入符号(即输入指针所指向的符号)。

性质:

  1. 没有公共左因子
  2. 没有左递归
  3. 没有二义性

构造预测分析表

输入:文法G。

输出:预测分析表M。

方法:对文法的每个产生式 A → α,执行(1)和(2)。

(1)对 FIRST(α) 的每个终结符 a,把 A → α 加入M[A,a]。

(2)如果 ε 在 FIRST(α) 中,对 FOLLOW(A) 的每个终结符 b(包括$),把 A → α 加入M[A,b] (包括M[A,$])
M剩下的条目没有定义,都是出错条目,通常用空白表示。

LR分析方法的特点

  • 栈中的文法符号总是形成一个活前缀
  • 分析表的转移函数本质上是识别活前缀的DFA
  • 栈顶的状态符号包含了确定句柄所需要的一切信息

LR分析方法和LL分析方法的比较

语法分析的java代码 语法分析 算法_语法分析的java代码_03


语法分析的java代码 语法分析 算法_句柄_04

LR(1)方 法

LL(1)方 法

建立分析树的方式

自 下 而 上

自 上 而 下

归约还是推导

规 范 归 约

最 左 推 导

决定使用产生式的时机

看见产生式右部推出的整个终结符串后,才确定用哪个产生式进行归约

看见产生式右部推出的第一个终结符后,便要确定用哪个产生式推导

对文法的显式限制

对文法没有限制

无左递归、无公共子

分析表比较

状态×文法符号,分析表大

非终结符×终结符,分析表小

分析栈比较

状态栈,通常状态比文法符号包含更多信息

文法符号栈

确定句柄

根据栈顶状态和下一个符号便可以确定句柄和归约所用产生式

无句柄概念

语法错误

决不会将出错点后的符号移入分析栈

和LR一样,决不会读过出错点而不报错