我是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
,但显然没有这样的规则。我错过了什么?
短:因为在具体情况下可能涉及0到两个表达式。
- 如果是
primary
,ExpressionContext.expression()
将返回一个空列表,因为没有匹配的表达式。 - 如果它是一个
expression '&' expression
,它将返回两个expression
。 - 如果是
expression '.' Identifier
,则返回单个expression
。
你可以这样做:
expression
: primary
| idExpr = expression '.' Identifier
| thisExpr = expression '.' 'this'
//..
| leftAndExpression = expression '&&' rightAndExpression = expression
然后您可以通过名称访问它们,如ExpressionContext.leftAndExpression
(如果此选项确实匹配)。