我是Java.g4语法。表达式解析规则如下所示:
expression
: primary
| expression '.' Identifier
| expression '.' 'this'
| expression '.' 'new' nonWildcardTypeArguments? innerCreator
| expression '.' 'super' superSuffix
| expression '.' explicitGenericInvocation
| expression '[' expression ']'
| expression '(' expressionList? ')'
| 'new' creator
| '(' type ')' expression
| expression ('++' | '--')
| ('+'|'-'|'++'|'--') expression
| ('~'|'!') expression
| expression ('*'|'/'|'%') expression
| expression ('+'|'-') expression
| expression ('<' '<' | '>' '>' '>' | '>' '>') expression
| expression ('<=' | '>=' | '>' | '<') expression
| expression 'instanceof' type
| expression ('==' | '!=') expression
| expression '&' expression
| expression '^' expression
| expression '|' expression
| expression '&&' expression
| expression '||' expression
| expression '?' expression ':' expression
| <assoc=right> expression
( '='
| '+='
| '-='
| '*='
| '/='
| '&='
| '|='
| '^='
| '>>='
| '>>>='
| '<<='
| '%='
)
expression
;
但是,当我查看生成的
ExpressionContext
类型时,发现调用expression()
将返回List<JavaParser.ExpressionContext>
而不是单个ExpressionContext
。根据上面的语法,这没有任何意义。对于要生成的代码,我希望有一个规则
expression : expressionList
,但是显然没有这样的规则。我想念什么? 最佳答案
简短:因为具体案例中可能涉及零到两个表达式。
如果它是primary
,则由于没有匹配的表达式,ExpressionContext.expression()
将返回一个空列表。
如果是expression '&' expression
,它将返回两个expression
。
如果是expression '.' Identifier
,它将返回单个expression
。
您可以执行以下操作:
expression
: primary
| idExpr = expression '.' Identifier
| thisExpr = expression '.' 'this'
//..
| leftAndExpression = expression '&&' rightAndExpression = expression
然后,您可以通过名称访问它们,例如
ExpressionContext.leftAndExpression
(如果此选项确实匹配)。