Part a (translation rules)
exp -> exp plus term exp1.trans = exp2.trans + term.trans -> exp minus term exp1.trans = exp2.trans - term.trans -> term exp.trans = term.trans term -> term times factor term1.trans = term2.trans * factor.trans -> term divide factor term1.trans = term2.trans / factor.trans -> factor term.trans = factor.trans factor -> INTLITERAL factor.trans = INTLITERAL.value -> lparen exp rparen factor.trans = exp.trans
Part b (translation actions with numbers)
exp -> exp + term termTrans = pop(); #1 expTrans = pop(); push(expTrans+termTrans); -> exp - term termTrans = pop(); #2 expTrans = pop(); push(expTrans-termTrans); -> term // do nothing term -> term * factor facterTrans = pop(); #3 termTrans = pop(); push(termTrans*factorTrans); -> term / factor factorTrans = pop(); #4 termTrans = pop(); push(termTrans/factorTrans); -> factor // do nothing factor -> INTLITERAL push(INTLITERAL.value) #5 -> ( exp ) // do nothingPart c (CFG with action numbers)
exp -> exp + term #1 -> exp - term #2 -> term term -> term * factor #3 -> term / factor #4 -> factor factor -> #5 INTLITERAL -> ( exp )
Non-LL(1) CFG with action numbers
exp -> exp + term #1 -> exp - term #2 -> term term -> term * factor #3 -> term / factor #4 -> factor factor -> #5 INTLITERAL -> ( exp )Transformed to be LL(1)
exp -> term exp' exp' -> epsilon -> + term #1 exp' -> - term #2 exp' term -> factor term' term' -> epsion -> * factor #3 term' -> / factor #4 term' factor -> #5 INTLITERAL -> ( exp )Actions of the predictive parser on input 2+3*4
input so far stack semantic stack action ------------ ----- -------------- ------ 2 exp EOF pop, push "term exp'" 2 term exp' EOF pop, push "factor term'" 2 factor term' exp' EOF pop, push "#5 INTLITERAL" 2 #5 INTLITERAL term' exp' EOF pop, do action 2 INTLITERAL term' exp' EOF 2 pop, scan 2+ term' exp' EOF 2 pop, push nothing 2+ exp' EOF 2 pop, push "+ term #1 exp'" 2+ + term #1 exp' EOF 2 pop, scan 2+3 term #1 exp' EOF 2 pop, push "factor term'" 2+3 factor term' #1 exp' EOF 2 pop, push "#5 INTLITERAL" 2+3 #5 INTLITERAL term' #1 exp' EOF 2 pop, do action 2+3 INTLITERAL term' #1 exp' EOF 3 2 pop, scan 2+3* term' #1 exp' EOF 3 2 pop, push "* factor #3" 2+3* * factor #3 #1 exp' EOF 3 2 pop, scan 2+3*4 factor #3 #1 exp' EOF 3 2 pop, push "#5 INTLITERAL" 2+3*4 #5 INTLITERAL #3 #1 exp' EOF 3 2 pop, do action 2+3*4 INTLITERAL #3 #1 exp' EOF 4 3 2 pop, scan 2+3*4 EOF #3 #1 exp' EOF 4 3 2 pop, do action 2+3*4 EOF #1 exp' EOF 12 2 pop, do action 2+3*4 EOF exp' EOF 14 pop, push nothing 2+3*4 EOF EOF 14 pop, push nothing 2+3*4 EOF 14 empty stack, input accepted final translation = 14