Eu tenho que escrever uma gramática para Pascal, e há apenas uma coisa que está causando problemas.
Digamos que temos operadores (classificados por prioridade de baixa a alta):
- Postfix
^
. - Prefixo
^
. [ ]
, e.
, (mesma prioridade e associativo à esquerda).- O único terminal
id
é qualquer letra minúscula.
Agora vamos dizer que uma expressão é:
- Qualquer id.
- Qualquer expressão com o operador Postfix
^
. - Qualquer expressão com o operador Prefixo
^
. - Qualquer expressão com
.
seguida porid
. - Qualquer expressão com
[
e outra expressão e]
.
Agora, gostaria de saber como fazer uma gramática LALR sem conflitos de turno-redução e redução-redução, OU, se isso não puder ser feito, como posso provar que isso não pode ser feito?
Alguns exemplos:
good:
a.b.c.d
a.b^.c
^a.b^
a.b^^[c]^^.d.e
^^a.b^.d.e^[]
bad:
a.^b.c
Sem o prefixo ^
, esse problema é fácil de resolver, mas o sinal do prefixo continua me pegando. Alguém pode ajudar? Minhas soluções até agora:
// this works without the prefix but it does not produce a.b^.c which is wrong.
A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] | C . id;
Por isso, pensei que o prefixo só pode ocorrer antes do primeiro ponto e, entre os pontos, só pode haver um postfix ^
e colchetes. Então, eu vim com isso:
A ::= B | A ^ ;
B ::= C | ^ B ;
C ::= id | C [ A ] |id D;
D ::= id E;
F ::= E | F ^;
E ::= id | F . id;
Mas isso causa 3 conflitos.