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 ')'
;
... но это не так аккуратно, как могло бы быть, верно? :]
Спасибо!