我是一个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 :(得分:1)
简短:因为具体情况可能涉及零到两个表达式。
primary
,ExpressionContext.expression()
将返回一个空列表,因为没有匹配的表达式。expression '&' expression
,则会返回两个expression
。expression '.' Identifier
,则会返回单expression
。你可以做的是这样的事情:
expression
: primary
| idExpr = expression '.' Identifier
| thisExpr = expression '.' 'this'
//..
| leftAndExpression = expression '&&' rightAndExpression = expression
然后您可以按名称ExpressionContext.leftAndExpression
访问它们(如果此选项真的匹配)。