bison / yacc - пределы настроек приоритета

Поэтому я пытался разобрать грамматику языка, похожую на хаскель, с бизоном. Я опущу стандартные проблемы с грамматикой и унарный минус (например, что это(-5) от-5 а также\x->x-5 или еслиa-b являетсяa-(b) или жеapply a (-b) что само по себе еще может бытьapply a \x->x-bХаха.) иди прямо к тому, что меня удивило.

Чтобы упростить все это до такой степени, что это имеет значение, рассмотрим следующую ситуацию:

expression: '(' expression ')'
    | expression expression            /* lambda application */
    | '\\' IDENTIFIER "->" expression  /* lambda abstraction */
    | expression '+' expression        /* some operators to play with */
    | expression '*' expression
    | IDENTIFIER | CONSTANT            /* | ..... */
    ;

Я решил все конфликты сдвига / уменьшения с помощью «+» и «*» с помощью макросов приоритета% left и% right, но мне почему-то не удалось найти хорошего решения, как установить приоритет дляexpression expression лямбда-приложение. Я пробовал% приоритет и% слева и% пред маркер, как показано, например, здесь%http://www.gnu.org/software/bison/manual/html_node/Non-Operators.html#Non-Operators, но похоже, что бизон полностью игнорирует любой параметр приоритета в этом правиле. По крайней мере все комбинации, которые я пробовал, потерпели неудачу. Документация по этой теме довольно скудная, похоже, она подходит только для обработки "классики".expr. OPER expr. дело.

Вопрос: Я что-то не так делаю или это невозможно в Bison? Если нет, то это просто не поддерживается или есть какое-то теоретическое обоснование, почему нет?

замечаниеКонечно, есть простой способ обойти левое сворачивание и приоритет, который будет выглядеть схематично

expression: expression_without_lambda_application
    | expression expression_without_lambda_application
    ;

expression_without_lambda_application: /* ..operators.. */
    | '(' expression ')'
    ;

... но это не так аккуратно, как могло бы быть, верно? :]

Спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос