解析antlr3中的mixfix表达式

Parsing mixfix expression in antlr3

我需要修改 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; };

通常的方法是为每个优先级设置一个不同的非终结符,就像这样(请注意,您似乎颠倒了 sum 和 produce 的优先级,所以我也修复了它):

expr:   sum | let;

let:    'let' ID '=' expr 'in' expr ;

sum:    product ( ('+'|'-') prodcut)* ;

product: atom ( ('*'|'/') atom )* ;

atom:   INT
    |   ID
    |   '(' expr ')'
    ;

没有问题。

输入的解析树

let x=3 in x + 1
3 * let x = 2 in x+1