【发布时间】:2017-06-10 12:59:21
【问题描述】:
我需要调整 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)一样。 -
我试过设置
options { greedy = true; },但可能位置不对?