P => Program K => Block
S => Single-command
C => Commands
E => Expression
B => Boolean-expr
I => Identifier
N > Numeral
P ::= K.
K ::= begin C end
C ::= C1 ; C2 | S
S ::= I := E | if (B) then S | if (B) then S1 else S2 | while (B) do S | repeat C until (B) | K | print E
E ::= − E | E1 + E2 | E1 − E2 | E1 E2 | E1 div E2 | E1 mod E2 | (E) | I | N
B ::= E1 = E2 | E1 > E2 | E1 < E2 | E1 != E2 | not B | B1 and B2 | B1 or B2 | (B)
I am supposed to remove ambiguities in E and B so that I can write a DCG parser in prolog.
Prolog evaluates top down, then LL grammar techniques can be adapted. DCG are more powerful than LL(1), but left recursion must still be eliminated.
B
is easier to handle: left factor the production.E is harder, because the miss
mul
token introduces still more ambiguity. Tentativelyepsilon (empty production) in DCG can be written this way
If you need to handle precedence and associativity (in both B and E) you will need more work. You can refer to this older answer for a working schema.