跳转至

LR(1)分析法

LR(1)分析法的提出

SLR存在的问题

\(SLR\)只是简单考察了下一个输入符号\(b\)是否归属于归约项目\(A\to\alpha\)相关联的\(FOLLOW(A)\),但\(b\in FOLLOW(A)\)只是归约\(\alpha\)的一个必要条件,而非充分条件

LR(1)分析法的提出

不含句柄右侧任何一个符号的规范句型前缀称为该句型的活前缀

假设符号栈中符号串为\(\delta\alpha\),输入指针指向终结符\(a\);如果想要进行归约\(A\to \alpha\),那么\(\delta A a\)应该为某一个规范句型的前缀

规范LR(1)项目

将形式为\([A\to\alpha\cdot\beta,a]\)的项称为LR(1)项,a是一个终结符(这里将$视为一个特殊的终结符)

它表示在当前状态下,A后面必须紧跟的终结符,称为该项的展望符

如何构造LR(1)项目?

对于一个LR(1)项目:\([A\to \alpha\cdot B\beta, a]\)

构建LR(1)项目:\([B\to \cdot \gamma, b]\)

其中\(b=\text{FIRST}(\beta a)\),当\(\beta\Rightarrow^+ \epsilon\)的时候,b为继承的后继符(b=a),否则称为自生的后继符