解析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
是
我需要修改 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
是