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的调试器(而不是解释器!)。你也可以通过代码生成它们,请参见以下问答: