为什么ExpressionContext.expression()在java-ANTLR4中返回一个列表而不是一个ExpressionContext

时间:2014-07-15 07:10:03

标签: java antlr4

我是一个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,但显然没有这样的规则。我错过了什么?

1 个答案:

答案 0 :(得分:1)

简短:因为具体情况可能涉及零到两个表达式。

  • 如果是primaryExpressionContext.expression()将返回一个空列表,因为没有匹配的表达式。
  • 如果是expression '&' expression,则会返回两个expression
  • 如果是expression '.' Identifier,则会返回单expression

你可以做的是这样的事情:

expression
   :   primary
   |   idExpr = expression '.' Identifier
   |   thisExpr = expression '.' 'this'
   //..
   |   leftAndExpression = expression '&&' rightAndExpression = expression

然后您可以按名称ExpressionContext.leftAndExpression访问它们(如果此选项真的匹配)。