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!

questionAnswers(1)

yourAnswerToTheQuestion