theory - 如何识别文法是LR(0)还是SLR(1)?

标签 theory compiler-construction automata-theory

这个文法是LR(0)还是SLR(1)?

S -> E $
E -> T + E | T
T -> x

最佳答案

下图证明该文法在 LR(0) 中NOT(它存在移位归约冲突):

+--------------+     E      +------------+
|              |----------> | S -> E . $ |
| S -> . E $   |            +------------+
| E -> . T + E |            
| E -> . T     |     T      +--------------+       state 2
| T -> . x     |----------> | E -> T . + E | This state contains a
|              |            | E -> T .     | Shift-Reduce conflict.
+--------------+            +--------------+
       |                      | +       ^
       | x                    V         | T
       |                    +--------------+
       V                    | E -> T + . E |
+---------------+      x    | E -> . T + E |          +--------------+
|    T -> x .   | <---------| E -> . T     |--------> | E -> T + E . |
+---------------+           | T -> . x     |          +--------------+
                            +--------------+

但是,它在 SLR(1) 中,因为状态 2 中的冲突可以通过使用 + 标记在 FOLLOW(E) 中不是这一事实来解决。 由于 SLR(1) 解析器可以向前查看 1 个标记,因此如果下一个标记是 +,它们可以决定在状态 2 中转移(并通过这样做解决冲突)。

如果 SLR(1) 解析器处于状态 2,并且下一个标记是 +, 为什么不选择减少?

好吧,假设解析器选择减少 E -> T。 然后最终 + 标记将被读取,并且它将跟随 E、 或 E 派生自的某个其他变量(此语法中只有 S)。 但是 E 和 S 都不能让 + 标记(立即)跟随它们!

关于theory - 如何识别文法是LR(0)还是SLR(1)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31454272/

相关文章:

java - 数组成员(Java 数组理论)

compiler-construction - Bison 可以验证范围和语法吗?

automata-theory - 线性时间逻辑问题(2)

regular-language - 语言 C={a,b} 的正则表达式

regex - 正则表达式转 DFA

c++ - 什么时候在不牺牲正确性的情况下有意识地利用未指定的行为会带来好处?

theory - 了解 Coq 中的 "well founded"证明

computer-science - 验证语法是否强 LL(2)

assembly - 将 AST 编译为汇编

java - 在 Java 中产生条件编译时错误