表达式的 ANTLR 语法
我正在尝试实现一个表达式处理语法(处理嵌套括号和其他内容)。到目前为止,我有以下内容,但它们无法处理某些情况(成功/失败的情况出现在以下代码块之后)。有人知道发生了什么事吗?
注意:varname += 和 varname = 内容只是 XText 中的一些附加 AST 生成帮助程序内容。暂时不用担心他们。
...
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
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?
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
发生的事情是您的表达式/表达式支持单括号,但不支持多个括号(正如您得出的结论)。我没有 ANTLR 的具体经验,但我使用过 Javacc,它有许多相似的概念(我为 Prolog 编写了语法......不要问)。
要处理嵌套括号,通常需要类似以下内容:
这意味着表达式要么包含在括号中,要么只是一个原始表达式。至于 AST 如何处理这个问题,ParenthesisExpression“是一个”表达式,因此它可以表示为子类或实现(如果表达式是某种接口/抽象类)。
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:
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).
使用位于标记/规则名称之后的
^
对于定义表达式非常有用。Make use of the
^
placed after the token/rule name is very useful for defining expressions.我将这个语法用于简单的表达式:
http://fisheye2.atlassian .com/browse/~raw,r=5175/antlr-examples/C/polydiff/Poly.g
我还使用了该项目中包含的语法来实现更复杂的表达式:
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx
I've used this grammar for simple expressions:
http://fisheye2.atlassian.com/browse/~raw,r=5175/antlr-examples/C/polydiff/Poly.g
I've also used the grammar contain in this project for more complex expressions:
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx