首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别语法是LR(0)还是SLR(1)?

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

Stack Overflow用户
提问于 2015-07-16 12:32:13
回答 1查看 1.9K关注 0票数 2

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

代码语言:javascript
复制
S -> E $
E -> T + E | T
T -> x
EN

回答 1

Stack Overflow用户

发布于 2017-11-09 19:23:37

下图证明该语法在LR(0)中是而不是(它有一个移位减少冲突):

代码语言:javascript
复制
+--------------+     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中的冲突可以通过以下(E)中的+令牌是而不是来解决。因为SLR(1)解析器可以向前看1个令牌,所以如果下一个令牌是+(并通过这样做解决冲突),它们可以决定在状态2中shift。

如果SLR(1)解析器处于状态2,而下一个令牌是+,为什么不选择减?

那么,假设解析器选择减少E -> T,那么最终将读取+令牌,它将跟随E或E派生的其他变量(只有这个语法中的S)。但是,E和S都不能让+令牌(立即)跟随它们!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31454272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档