表达式的 ANTLR 语法 [英] ANTLR Grammar for expressions
问题描述
我正在尝试实现表达式处理语法(处理嵌套括号和其他内容).到目前为止,我有以下内容,但他们无法处理某些情况(成功/失败情况出现在以下代码块之后).有人知道是怎么回事吗?
I'm trying to implement a expression handling grammar (that deals with nested parenthesis and stuff). I have the following so far, but they can't deal with some cases (successful/failure cases appear after the following code block). Anyone know what's going on?
注意:varname += 和 varname = 内容只是 XText 中一些额外的 AST 生成助手内容.暂时不用担心.
Note: The varname += and varname = stuff are just some additional AST generation helper stuff in XText. Don't worry about them for now.
...
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* )
;
...
这是解析/失败的列表:
And here's the list of parses/fails:
c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses
推荐答案
发生的情况是您的表达式/表达式支持单括号但不支持多括号(正如您得出的结论).我没有 ANTLR 特定的经验,但我使用过 Javacc,它共享许多相似的概念(我为 Prolog 写了一个语法......不要问).
What's going on is that your Expression/Expressions support single parentheses but not multiple parentheses (as you concluded). I don't have ANTLR specific experience but I've worked with Javacc which shares many similar concepts (I wrote a grammar for Prolog... don't ask).
为了处理嵌套的括号,你通常有类似的东西:
To handle nested parentheses, you typically have something similar to:
ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';
这意味着表达式要么包含在括号中,要么只是一个原始表达式.至于 AST 如何处理这个问题,一个 ParenthesisExpression '是一个'表达式,因此它可以表示为子类或实现(如果 Expression 是某种接口/抽象类).
This would mean that the expression is either wrapped in parentheses or it's just a raw expression. As for how the AST deals with this, a ParenthesisExpression 'is a' Expression, so it can be represented as a subclass or an implementation of (if Expression is an interface/abstract class of sorts).
这篇关于表达式的 ANTLR 语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!