ANTLR语法的表达式
-
12-09-2019 - |
题
我试图实现一个表达式处理语法(即带有嵌套括号和东西涉及)。我见到目前为止以下,但他们不能与某些情况下(成功/失败案例出现在下面的代码块之后)处理。任何人都知道这是怎么回事?
注意: VARNAME + = 和 VARNAME = 的东西都只是一些额外AST代帮手XTEXT东西。不要担心他们现在。
...
NilExpression returns Expression:
'nil';
FalseExpression returns Expression:
'false';
TrueExpression returns Expression:
'true';
NumberExpression returns Expression:
value=Number;
StringExpression returns Expression:
value=STRING; //EllipsesExpression: '...';
//FunctionExpression: function=function; //don't allow random functions
UnaryExpression:
op=unop ('(' expr=Expression ')')|expr=Expression;
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' '-')? MultDivOp;
MultDivOp:
('*' '/')? ExpOp;
ExpOp:
'^'? (('(' expr=Expression ')')|expr=Expression);
ExprSideOne : Variable|NilExpression|FalseExpression|TrueExpression|
NumberExpression|StringExpression|UnaryExpression;
Expression:
(
'('
expression1=ExprSideOne expression2+=BinaryExpression*
')'
)
|
( expression1=ExprSideOne expression2+=BinaryExpression* )
;
...
和这里的解析列表/失败:
c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses
解决方案
这是怎么回事是您的表达式/表达式支持单括号而不是多个括号(如你的结论)。我没有ANTLR具体的经验,但我已经与JavaCC的这股许多类似概念的工作(我写了一个语法的Prolog的...不要问)。
要处理嵌套括号,则典型地具有类似于:
ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';
这将意味着表达任一包裹在括号或它只是一个原始的表达。至于如何与此AST交易,一个ParenthesisExpression“是”的表达,所以它可以被表示为一个子类或的实现(如果表达是一个接口/抽象类种类的)。
其他提示
请使用^
的放置的后强>令牌/规则名称是用于定义表达式非常有用的。
expression : e1 (OR^ e1)* ;
e1 : e2 (AND^ e2)*;
e2 : e3 (PIPE^ e3)*;
e3 : e4 (ANDSYMB^ e4)*;
e4 : e5 ((EQUAL^|NOTEQUAL^) e5)*;
e5 : e6 ((LESS^|GREATER^) e6)*;
e6 : e7 ((PLUS^|MINUS^) e7)* ;
e7 : e8 ((STAR^|SLASH^) e8)* ;
e8 : e9 (NEW^ ID LPAREN RPAREN)*;
e9 : (NOT^)? e10;
e10 : e11 | call_def;
e11 : constant
| '(' expression ')' -> expression;
我用这个语法简单表达式: HTTP://fisheye2.atlassian的.com /浏览/〜生,R = 5175 / ANTLR-实例/ C / polydiff / Poly.g
我也用语法包含在这个项目中的更复杂的表达式: http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx
不隶属于 StackOverflow