Algorithm LR(0)/SLR/LR(1)解析-如何选择产品?

Algorithm LR(0)/SLR/LR(1)解析-如何选择产品?,algorithm,parsing,lr,Algorithm,Parsing,Lr,我试着用解析器理论来概括我的想法,我一直在不同的来源中找到相同的例子。语法大致如下(简化): 因此,假定字符串2+2将被这样解析(“|”将堆栈与提醒分开) |2+2根据语法,一个E永远不能跟在一个+后面。这排除了该状态下的E=T生产 要完全理解这一点,请手动构造解析器表-该示例足够小,可以实现这一点。可能的状态是什么 0: Beginning 1: Just shifted 0..9 after State 0, recognize a T 2: Reduce State 1 to an E.

我试着用解析器理论来概括我的想法,我一直在不同的来源中找到相同的例子。语法大致如下(简化):

因此,假定字符串
2+2
将被这样解析(“|”将堆栈与提醒分开)


|2+2根据语法,一个
E
永远不能跟在一个
+
后面。这排除了该状态下的
E=T
生产


要完全理解这一点,请手动构造解析器表-该示例足够小,可以实现这一点。

可能的状态是什么

0: Beginning
1: Just shifted 0..9 after State 0, recognize a T
2: Reduce State 1 to an E.
3: Just shifted + after State 2 or 5, looking for T
4: Just shifted 0..9 after State 3, recognize a T giving us E + T.
5: Reduce state 4 to an E
6: Reach the end of the stack after state 2 or 5.
所以我们从状态0开始。换档a
2
。我们现在处于状态1。过渡到第2状态。移位a
+
。我们现在处于第三状态。我们移动a
2
。我们处于第四状态。我们减少到第五个州。我们到达堆栈的末尾,最后得到一个表达式树,如下所示:

  E
  |
E + T
|   |
T   2
|
2

看,这就是问题所在——解析器需要知道E=T会在一步后导致死胡同。如果不尝试,它怎么会知道呢?它可以在输入字符串中向前看,但它如何在自己的解析树中向前看呢?解析器在运行时不仅具有堆栈上的符号,而且还具有解析器状态。在允许和不允许减产的情况下,国家是不同的。你真的应该尝试手工构造状态。首先,我需要理解解析器状态是什么。。。不过,谢谢!啊,所以解析器可以处于不同的状态,尽管刚刚应用了相同的归约,这取决于归约的历史?Like自动机可以在同一输入符号上达到不同的状态,这取决于之前的当前状态?@Vindicar Yes。完全像一个机器人。@Vindicar是的。你可以想象它是否像一台自动售货机一样,在走的时候会离开并偶尔清理面包屑的痕迹。这个面包屑痕迹会变成解析树。
0: Beginning
1: Just shifted 0..9 after State 0, recognize a T
2: Reduce State 1 to an E.
3: Just shifted + after State 2 or 5, looking for T
4: Just shifted 0..9 after State 3, recognize a T giving us E + T.
5: Reduce state 4 to an E
6: Reach the end of the stack after state 2 or 5.
  E
  |
E + T
|   |
T   2
|
2