我是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(如果此选项确实匹配)。

10-04 12:23