Ho la seguente grammatica per le espressioni logiche, relazionali e aritmetiche che ho bisogno di rendere compatibile LL (1).
E -> A | B
A -> A op1 T | T
T -> T op2 F | F
F -> ( A ) | v
B -> B lop B2 | B2
B2 -> A rop A | ( B )
op1 -> + | -
op2 -> * | /
rop -> > | < | == | <= | >=
lop -> AND | OR
Finora sono stato in grado di rimuovere la ricorsione sinistra
E -> A | B
A -> T A2
A2 -> op1 T A2 | e
T -> F T2
T2 -> op2 F T2 | e
F -> ( A ) | v
B -> B2 B3
B3 -> lop B2 B3 | e
B2 -> A rop A | (B)
op1 -> + | -
op2 -> * | /
rop -> > | < | == | <= | >=
lop -> AND | OR
Dove e è la stringa nulla. Ora dopo questo non riesco a capire come renderlo compatibile con LL (1).
(Questo è un problema di compiti a casa. Qualsiasi aiuto sarebbe apprezzato)
EDIT: Il mio problema principale è quando una parentesi aperta si incontra in E, con un lookahead non riesco a decidere se la regola
E -> A
dovrebbe essere seguito o la regola
E -> B
Questo perché entrambi derivano stringhe che iniziano con una parentesi di apertura. Non sono in grado di capire come rimuovere questo problema.