Symbol
-2 EMPTY 0 "end of file" 1 error 2 "invalid token" (undef) 3 LF 4 NUM 5 '+' 6 '*' 7 '(' 8 ')' 9 $accept # Start of nonterminal 10 program 11 expr
Grammar
0 $accept: program "end of file" 1 program: ε 2 | expr LF 3 expr: NUM 4 | expr '+' expr 5 | expr '*' expr 6 | '(' expr ')'
State 0
0 $accept: • program "end of file" 1 program: ε • ["end of file"] 2 | • expr LF 3 expr: • NUM 4 | • expr '+' expr 5 | • expr '*' expr 6 | • '(' expr ')' NUM shift, and go to state 1 '(' shift, and go to state 2 $default reduce using rule 1 (program) program go to state 3 expr go to state 4
State 1
3 expr: NUM • $default reduce using rule 3 (expr)
State 2
3 expr: • NUM 4 | • expr '+' expr 5 | • expr '*' expr 6 | • '(' expr ')' 6 | '(' • expr ')' NUM shift, and go to state 1 '(' shift, and go to state 2 expr go to state 5
State 3
0 $accept: program • "end of file" "end of file" shift, and go to state 6
State 4
2 program: expr • LF 4 expr: expr • '+' expr 5 | expr • '*' expr LF shift, and go to state 7 '+' shift, and go to state 8 '*' shift, and go to state 9
State 5
4 expr: expr • '+' expr 5 | expr • '*' expr 6 | '(' expr • ')' '+' shift, and go to state 8 '*' shift, and go to state 9 ')' shift, and go to state 10
State 6
0 $accept: program "end of file" • $default accept
State 7
2 program: expr LF • $default reduce using rule 2 (program)
State 8
3 expr: • NUM 4 | • expr '+' expr 4 | expr '+' • expr 5 | • expr '*' expr 6 | • '(' expr ')' NUM shift, and go to state 1 '(' shift, and go to state 2 expr go to state 11
State 9
3 expr: • NUM 4 | • expr '+' expr 5 | • expr '*' expr 5 | expr '*' • expr 6 | • '(' expr ')' NUM shift, and go to state 1 '(' shift, and go to state 2 expr go to state 12
State 10
6 expr: '(' expr ')' • $default reduce using rule 6 (expr)
State 11
4 expr: expr • '+' expr 4 | expr '+' expr • [LF, '+', ')'] 5 | expr • '*' expr '*' shift, and go to state 9 $default reduce using rule 4 (expr) Conflict between rule 4 and token '+' resolved as reduce (%left '+'). Conflict between rule 4 and token '*' resolved as shift ('+' < '*').
State 12
4 expr: expr • '+' expr 5 | expr • '*' expr 5 | expr '*' expr • [LF, '+', '*', ')'] $default reduce using rule 5 (expr) Conflict between rule 5 and token '+' resolved as reduce ('+' < '*'). Conflict between rule 5 and token '*' resolved as reduce (%left '*').