Грамматика Antlr4 для применения функций

Я пытаюсь написать простую грамматику лямбда-исчисления (см. Ниже). Проблема, с которой я столкнулся, заключается в том, что приложение функции, похоже, рассматривается как правоассоциативное, а не левоассоциативное, например. «f 1 2» анализируется как (f (1 2)) вместо ((f 1) 2). В ANTLR есть опция assoc для токенов, но я не понимаю, как это здесь помогает, поскольку нет оператора для приложения функции. Кто-нибудь видит решение?

LAMBDA : '\\';
DOT : '.';
OPEN_PAREN : '(';
CLOSE_PAREN : ')';
fragment ID_START : [A-Za-z+\-*/_];
fragment ID_BODY : ID_START | DIGIT;
fragment DIGIT : [0-9];
ID : ID_START ID_BODY*;
NUMBER : DIGIT+ (DOT DIGIT+)?;
WS : [ \t\r\n]+ -> skip;

parse : expr EOF;

expr : variable                     #VariableExpr
     | number                       #ConstantExpr
     | function_def                 #FunctionDefinition
     | expr expr                    #FunctionApplication
     | OPEN_PAREN expr CLOSE_PAREN  #ParenExpr
;
function_def : LAMBDA ID DOT expr;
number : NUMBER; 
variable : ID;

Спасибо!


person Nick Rioux    schedule 27.10.2013    source источник


Ответы (1)


это нарушает сопоставление шаблонов 4.1 для левой рекурсии. я считаю, что убрано в основной ветке. попробуйте скачать последний мастер и собрать. Текущая версия 4.1 генерирует:

выражение [int _p]: ({} переменная | число | определение_функции | OPEN_PAREN выражение CLOSE_PAREN) ({2> = $ _p}? выражение) *;

для этого правила. expr ref in loop на самом деле expr [0], что неверно.

person Terence Parr    schedule 28.10.2013
comment
Эта проблема все еще возникает у меня в v4.2.2. Здесь есть еще одна проблема? - person Nick Rioux; 19.04.2014
comment
Я думаю, что expr expr является проблемой. нет оператора. Может создать проблему. - person Terence Parr; 19.04.2014