Antlr - 表达式解析器和求值器
Antlr - Expression parser and evaluator
我需要写一个布尔表达式parser/evaluator。
表达式将采用以下形式并括在括号中:
exp1 : (A = B)
exp2 : ((A = B) AND (C = D))
exp3 : ((A = B) AND ((C = D) OR (E = F)))
exp4: (((A = B) AND (C = D)) OR (E = F))
它还在继续。该规则可能包含 'n' 个表达式,每个组中有 2 个正确的分组。我的语法文件如下所示:
/*
Expression grammar
*/
grammar Exparser;
options
{
language = Java;
}
cond :
tc EOF;
tc:
exp
| binary_exp
| leftparen* exp ( binaryop leftparen* exp rightparen+)*
| leftparen* exp ( binaryop leftparen* exp rightparen*)*
;
binary_exp:
'(' exp BINARYOP exp ')'
;
binaryop:
BINARYOP
;
leftparen:
LEFTPARN
;
rightparen:
RIGHTPARN
;
exp:
LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN
;
variable:
VARIABLE;
BINARYOP: AND | OR;
COMPOP: EQUAL | LT | GT | LTE | GTE | NE;
VARIABLE: (CHAR)+;
LEFTPARN: '(';
RIGHTPARN: ')';
EQUAL: '=' | 'EQ';
LT: '<' | 'LT';
GT:'>' | 'GT';
LTE: '<=';
GTE: '>=';
NE : '!=' | 'NE';
AND: 'AND' | '&' | 'and';
OR: 'OR' | 'or';
CHAR : 'a'..'z'|'A'..'Z'|'_' |'0'..'9'|'-' | '.'
;
这个语法工作正常,但我无法达到 AST 的深度。例如 exp3 被解析为三个 exp
而不是一个 exp
和一个 binary_exp
。
另外,如何使用我的解析器评估布尔表达式?
我的语法如何强制括号平衡?
虽然 给出了一些评估表达式的想法,但我无法在我的案例中应用
警告:我不知道 antlr。但是,我认为您需要使语法更明确。您 exp
超载太多了。试试这样的伪代码:
tc <- binary_exp ;
binary_exp <- comparison_exp
| LEFTPARN binary_exp RIGHTPARN
| LEFTPARN binary_exp BINARYOP binary_exp RIGHTPARN ;
comparison_exp <- LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN ;
- 每个
tc
都是一个二进制表达式binary_exp
.
- 二进制表达式是以下之一:
- 比较表达式
comparison_exp
,
- 用圆括号(
LEFTPARN
和 RIGHTPARN
)包围的二进制表达式,
- 或一系列左括号
LEFTPARN
、一个 binary_exp
、一个二元运算符 BINARYOP
、一个 binary_exp
和一个右括号 RIGHTPARN
.
- 比较表达式是左括号
LEFTPARN
、变量 VARIABLE
、比较运算符 COMPOP
、VARIABLE
和右括号的序列RIGHTPARN
.
此语法允许二进制表达式嵌套在额外的括号内或彼此嵌套,但比较表达式不能在其中嵌套其他表达式。
从以下语法生成的解析器解析您的所有示例输入:
grammar Exparser;
parse
: expr EOF
;
expr
: expr binop expr
| VARIABLE
| '(' expr ')'
;
binop
: AND | OR | EQUAL | LT | GT | LTE | GTE | NE
;
EQUAL : '=' | 'EQ';
LT : '<' | 'LT';
GT : '>' | 'GT';
LTE : '<=';
GTE : '>=';
NE : '!=' | 'NE';
AND : 'AND' | '&' | 'and';
OR : 'OR' | 'or';
VARIABLE : [a-zA-Z0-9_.-]+;
SPACE : [ \t\r\n] -> skip;
计算这些表达式应该与 .
相同
我需要写一个布尔表达式parser/evaluator。 表达式将采用以下形式并括在括号中:
exp1 : (A = B)
exp2 : ((A = B) AND (C = D))
exp3 : ((A = B) AND ((C = D) OR (E = F)))
exp4: (((A = B) AND (C = D)) OR (E = F))
它还在继续。该规则可能包含 'n' 个表达式,每个组中有 2 个正确的分组。我的语法文件如下所示:
/*
Expression grammar
*/
grammar Exparser;
options
{
language = Java;
}
cond :
tc EOF;
tc:
exp
| binary_exp
| leftparen* exp ( binaryop leftparen* exp rightparen+)*
| leftparen* exp ( binaryop leftparen* exp rightparen*)*
;
binary_exp:
'(' exp BINARYOP exp ')'
;
binaryop:
BINARYOP
;
leftparen:
LEFTPARN
;
rightparen:
RIGHTPARN
;
exp:
LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN
;
variable:
VARIABLE;
BINARYOP: AND | OR;
COMPOP: EQUAL | LT | GT | LTE | GTE | NE;
VARIABLE: (CHAR)+;
LEFTPARN: '(';
RIGHTPARN: ')';
EQUAL: '=' | 'EQ';
LT: '<' | 'LT';
GT:'>' | 'GT';
LTE: '<=';
GTE: '>=';
NE : '!=' | 'NE';
AND: 'AND' | '&' | 'and';
OR: 'OR' | 'or';
CHAR : 'a'..'z'|'A'..'Z'|'_' |'0'..'9'|'-' | '.'
;
这个语法工作正常,但我无法达到 AST 的深度。例如 exp3 被解析为三个 exp
而不是一个 exp
和一个 binary_exp
。
另外,如何使用我的解析器评估布尔表达式?
我的语法如何强制括号平衡?
虽然
警告:我不知道 antlr。但是,我认为您需要使语法更明确。您 exp
超载太多了。试试这样的伪代码:
tc <- binary_exp ;
binary_exp <- comparison_exp
| LEFTPARN binary_exp RIGHTPARN
| LEFTPARN binary_exp BINARYOP binary_exp RIGHTPARN ;
comparison_exp <- LEFTPARN VARIABLE COMPOP VARIABLE RIGHTPARN ;
- 每个
tc
都是一个二进制表达式binary_exp
. - 二进制表达式是以下之一:
- 比较表达式
comparison_exp
, - 用圆括号(
LEFTPARN
和RIGHTPARN
)包围的二进制表达式, - 或一系列左括号
LEFTPARN
、一个binary_exp
、一个二元运算符BINARYOP
、一个binary_exp
和一个右括号RIGHTPARN
.
- 比较表达式
- 比较表达式是左括号
LEFTPARN
、变量VARIABLE
、比较运算符COMPOP
、VARIABLE
和右括号的序列RIGHTPARN
.
此语法允许二进制表达式嵌套在额外的括号内或彼此嵌套,但比较表达式不能在其中嵌套其他表达式。
从以下语法生成的解析器解析您的所有示例输入:
grammar Exparser;
parse
: expr EOF
;
expr
: expr binop expr
| VARIABLE
| '(' expr ')'
;
binop
: AND | OR | EQUAL | LT | GT | LTE | GTE | NE
;
EQUAL : '=' | 'EQ';
LT : '<' | 'LT';
GT : '>' | 'GT';
LTE : '<=';
GTE : '>=';
NE : '!=' | 'NE';
AND : 'AND' | '&' | 'and';
OR : 'OR' | 'or';
VARIABLE : [a-zA-Z0-9_.-]+;
SPACE : [ \t\r\n] -> skip;
计算这些表达式应该与