Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LR1 Parser and Epsilon

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!

like image 892
Chris Avatar asked Jan 28 '09 08:01

Chris


2 Answers

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

like image 51
jpalecek Avatar answered Oct 01 '22 02:10

jpalecek


You can use this site to compute this: https://cyberzhg.github.io/toolbox/lr1

See the results:

enter image description here

like image 35
Rea Haas Avatar answered Oct 01 '22 04:10

Rea Haas