bison / yacc - limites de configurações de precedência
Então, eu tenho tentado analisar uma gramática de linguagem semelhante a haskell com bison. Vou omitir os problemas padrão com gramáticas e menos unários (como, o que é(-5)
de-5
e\x->x-5
ou sea-b
éa-(b)
ouapply a (-b)
que ainda pode serapply a \x->x-b
, haha.) e vá direto para a coisa que me surpreendeu.
Para simplificar tudo ao ponto em que importa, considere a seguinte situação:
expression: '(' expression ')'
| expression expression /* lambda application */
| '\\' IDENTIFIER "->" expression /* lambda abstraction */
| expression '+' expression /* some operators to play with */
| expression '*' expression
| IDENTIFIER | CONSTANT /* | ..... */
;
Resolvi todos os turnos / reduções de conflitos com '+' e '*' com as macros de precedência% esquerda e% direita, mas de alguma maneira não consegui encontrar uma boa solução para definir a precedência para oexpression expression
aplicação lambda. Tentei% precedence e% left e% prec marker como mostrado, por exemplo, aqui%http://www.gnu.org/software/bison/manual/html_node/Non-Operators.html#Non-Operators, mas parece que o bisonte está ignorando completamente qualquer configuração de precedência nessa regra. Pelo menos todas as combinações que tentei falharam. A documentação exatamente sobre esse tópico é bastante esparsa, tudo parece adequado apenas para lidar com o "clássico"expr. OPER expr.
caso.
Pergunta, questão: Estou fazendo algo errado, ou isso é impossível no Bison? Caso contrário, isso não é suportado ou há alguma justificativa teórica por que não?
Observação: É claro que existe uma solução fácil para forçar a dobra à esquerda e a precedência que pareceriam esquematicamente
expression: expression_without_lambda_application
| expression expression_without_lambda_application
;
expression_without_lambda_application: /* ..operators.. */
| '(' expression ')'
;
... mas isso não é tão legal quanto poderia ser, certo? :]
Obrigado!