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

时间:2018-11-27 08:16:15

标签: algorithm parsing lr

我正在尝试分析器理论,我一直在不同的来源中找到相同的示例。语法大致像这样(简化):

E = T
E = E + T
T = 0..9

因此,应该以这样的方式解析字符串2 + 2(“ |”将堆栈与提醒分开)

|2 + 2 <-can't reduce, shift
2|+ 2  <-reduce by T = 0..9
T|+ 2  <-reduce by E = T
E|+ 2  <-can't reduce, shift
E +|2  <-can't reduce, shift
E + 2| <-reduce by T = 0..9
E + T| <-reduction by E = E + T here?
E|     <-done

问题是,在E + T步骤中,解析器可以对堆栈的最右边部分应用两种不同的约简:E = T(导致E + E)和E = E + T(导致在E中)。而且我找不到一个清晰简洁的解释,说明它是如何选择一个的。

我想念什么?

2 个答案:

答案 0 :(得分:2)

可能的状态是什么?

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开始。移动2。我们现在处于状态1。过渡到状态2。移动+。我们现在处于状态3。我们移动了2。我们处于状态4。我们减少到状态5。我们到达堆栈的末尾,并得到如下所示的表达式树:

  E
  |
E + T
|   |
T   2
|
2

答案 1 :(得分:1)

根据语法,E永远不能遵循+。这将排除在此状态下产生的E = T

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