LR1 Parser and Epsilon

点点圈 提交于 2019-12-01 22:06:35

问题


I'm trying to understand how LR1 Parsers work but I came up with a strange problem: What if the grammar contains Epsilons? For instance: if I have the grammar:

S -> A
A -> a A | B
B -> a

It's clear how to start:

S -> .A
A -> .a A 
A -> .B

... and so on

but I don't know how to do it for such a grammar:

S -> A
A -> a A a | \epsilon

Is it correct to do:

S -> .A
A -> .a A a
( A -> .\epsilon )

And then make this State in the DFA accepting?

Any help would really be appreciated!


回答1:


Yes, exactly (think of the epsilon as empty space, where there aren't two places for the dot at the sides).

In an LR(0) automaton, you would make the state accepting and reduce to A. However, due to the A->a A a production, there'd be a shift/reduce conflict.

In a LR(1) automaton, you would determine whether to shift or reduce using lookahead (a -> shift, anything in FOLLOW(A) -> reduce)

See the Wikipedia article



来源:https://stackoverflow.com/questions/486920/lr1-parser-and-epsilon

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!