Parsing ANTLR重写规则中的备选方案

Parsing ANTLR重写规则中的备选方案,parsing,antlr,Parsing,Antlr,我正在写一个支持任意布尔表达式的语法。语法用于表示程序,该程序稍后将通过静态分析工具传递。静态分析工具有某些限制,因此我想应用以下重写规则: 严格不等式用ε近似: expression_a > expression_b -> expression_a >= expression_b + EPSILON 使用“或”语句近似表示不等式: expression_a != expression_b -> expression_a > expression_b || exp

我正在写一个支持任意布尔表达式的语法。语法用于表示程序,该程序稍后将通过静态分析工具传递。静态分析工具有某些限制,因此我想应用以下重写规则:

严格不等式用ε近似:

expression_a > expression_b -> expression_a >= expression_b + EPSILON
使用“或”语句近似表示不等式:

expression_a != expression_b -> expression_a > expression_b || expression_a < expression_b
expression\u a!=expression_b->expression_a>expression_b | | expression_a
使用ANTLR有什么简单的方法吗?目前我的语法是这样的:

comparison          : expression ('=='^|'<='^|'>='^|'!='^|'>'^|'<'^) expression;
比较:表达式('='^ |'='^ |'!='^ |'>'^ |'
[…]并以其他方式递归转换它,[…]

你可以做一部分

您不能告诉ANTLR将
a>b
重写为
^('>='a^('+'b epsilon))
,然后定义
a!=b
成为
^('.| ^('>'ab)^('/code>和
^('='a^('+'b epsilon))
^('+'b epsilon

快速演示:

grammar T;

options {
  output=AST;
}

tokens {
  AND;
  OR;
  GTEQ;
  LTEQ;
  SUB;
  ADD;
  EPSILON;
}

parse
 : expr
 ;

expr
 : logical_expr
 ;

logical_expr
 : comp_expr ((And | Or)^ comp_expr)*
 ;

comp_expr
 : (e1=mult_expr -> $e1) ( Eq   e2=mult_expr -> ^(AND ^(GTEQ $e1 $e2) ^(LTEQ $e1 $e2))
                         | LtEq e2=mult_expr -> ^(LTEQ $e1 $e2)
                         | GtEq e2=mult_expr -> ^(GTEQ $e1 $e2)
                         | NEq  e2=mult_expr -> ^(OR ^(GTEQ $e1 ^(ADD $e2 EPSILON)) ^(LTEQ $e1 ^(SUB $e2 EPSILON)))
                         | Gt   e2=mult_expr -> ^(GTEQ $e1 ^(ADD $e2 EPSILON))
                         | Lt   e2=mult_expr -> ^(LTEQ $e1 ^(SUB $e2 EPSILON))
                         )?
 ;

add_expr
 : mult_expr ((Add | Sub)^ mult_expr)*
 ;

mult_expr
 : atom ((Mult | Div)^ atom)*
 ;

atom
 : Num
 | Id
 | '(' expr ')'
 ;

Eq    : '==';
LtEq  : '<=';
GtEq  : '>=';
NEq   : '!=';
Gt    : '>';
Lt    : '<';
Or    : '||';
And   : '&&';
Mult  : '*';
Div   : '/';
Add   : '+';
Sub   : '-';
Num   : '0'..'9'+ ('.' '0'..'9'+)?;
Id    : ('a'..'z' | 'A'..'Z')+;
Space : ' ' {skip();};
语法T;
选择权{
输出=AST;
}
代币{
及;
或
GTEQ;
LTEQ;
附属的;
添加
ε;
}
作语法分析
:expr
;
expr
:逻辑运算
;
逻辑表达式
:comp_expr((和|或)^comp_expr)*
;
综合出口
:(e1=mult_expr->$e1)(等式e2=mult_expr->^(和^(GTEQ$e1$e2)^(LTEQ$e1$e2))
|LtEq e2=mult_expr->^(LtEq$e1$e2)
|GtEq e2=mult_expr->^(GtEq$e1$e2)
|NEq e2=mult_expr->^(或^(GTEQ$e1^(添加$e2 EPSILON))^(LTEQ$e1^(子$e2 EPSILON)))
|Gt e2=mult_expr->^(GTEQ$e1^(添加$e2 EPSILON))
|Lt e2=mult_expr->^(LTEQ$e1^(SUB$e2 EPSILON))
)?
;
添加表达式
:mult_expr((添加子项)^mult_expr)*
;
多出口
:原子((Mult | Div)^原子)*
;
原子
:Num
|身份证
|“('expr')”
;
等式:'=';
LtEq:“=”;
NEq:“!=”;
Gt:“>”;

Lt:“非常感谢!我不知道你可以在一个语句中使用多个重写规则。(顺便说一句,你如何生成这些图表?AntlWorks?@cheshire,不客气。是的,AST图像来自AntlWorks的调试器(而不是解释器!)。你也可以通过代码生成它们,请参见以下问答: