如何识别语法是LR(0)还是SLR(1)?

问题描述 投票:1回答:1

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

S -> E $
E -> T + E | T
T -> x
theory compiler-construction automata-theory
1个回答
0
投票

下图证明这个语法不在LR(0)中(它有一个shift减少冲突):

+--------------+     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,而下一个令牌是+,为什么不选择reduce?

好吧,假设解析器选择减少E - > T.然后最终将读取+标记,它将跟随E或E导出的其他变量(在此语法中只有S)。但E和S都没有+令牌(立即)跟随他们!

© www.soinside.com 2019 - 2024. All rights reserved.