E -> E + E | E * E | (E) | I I -> a | b | c E => E + E => I + E => a + E => a + E * E => a + I * E => a + b * E => a + b * I => a + b * c
E --> E + E | a
E -> E + a E -> a
E -> E + E E -> E * E E -> a
Here, the choice occurs at the first step. Either recursive rule will work since the resulting string (either E+E or E*E) can be grown from either side so it is possible start with either production and generate any sequence of plus and times operators.
E -> a + E E -> a * E E -> a
In this grammar, since it is only possible to grow on the right, the string must be generated from left to right and the next choice is always determined.
E -> a + E E -> E * a E -> a
if (b1) if (b2) s1; else s2;
STMT -> ASSIGN | IFSTMT ASSIGN -> ... IFSTMT -> if BOOL then STMT | if BOOL then STMT else STMT
STMT -> MATCHED | UNMATCHED MATCHED -> if BOOL then MATCHED else MATCHED | ASSIGN | begin STMT end UNMATCHED -> if BOOL then STMT | if BOOL then MATCHED else UNMATCHED
Right Associativity, eg evaluate a+b+c as a + (b+c)
Right Associativity: In parse tree, b+c is lower
E -> E + T | E T -> a | b | c
E -> T + E | E T -> a | b | c
Right recursive grammar builds subtrees to the right
E -> E + T | T T -> T * F | F F -> a | b | c
E -> E + T | E - T | T T -> T * F | T / F | F F -> a | b | c F -> (E)
E -> E + T | E - T | T T -> T * F | T / F | F F -> a | b | c
E -> T { (+ | -) T } T -> F { (* | /) F } F -> a | b | c
EXPR -> POWR ** EXPR | POWR POWR -> POWR + TERM | TERM ...
EXPR -> POWR [** EXPR] POWR -> TERM {+ TERM} ...
T * -> id *
x: Integer; y: Boolean; ... y := x; y := 3;