Мне нужно адаптировать грамматику ANTLR3 для поддержки выражений let. Оператору нужно привязать очень слабо. Например, let x=3 in x + 1
читается как let x=3 in (x+1)
, а не как (let x=3 in x) + 1
.
Моя кандидатская грамматика все еще неоднозначна, к сожалению. Есть ли стандартный способ сделать правила однозначными? (С дополнительным ( )
это работает.)
Кстати, вроде работает коробка с ANTLR4. Однако в моем случае это не вариант.
grammar Expr;
prog: stat+ ;
stat: expr NEWLINE
| ID '=' expr NEWLINE
| NEWLINE
;
expr: sum ( ('*'|'/') sum )* ;
sum: atom ( ('+'|'-') atom )* ;
atom: INT
| ID
| '(' expr ')'
// | '(' let ')'
| let
;
let: 'let' ID '=' expr 'in' expr ;
ID : ('a' .. 'z')+ ;
INT : ('0' ..'9')+ ;
NEWLINE: '\r'? '\n' ;
WS : ' ' { $channel = HIDDEN; };
3 * let x = 2 in x+1
совпадает с3 * (let x=2 in x+1)
. - person Matt   schedule 10.06.2017options { greedy = true; }
, но, возможно, не в том месте? - person Matt   schedule 10.06.2017