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



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

相关内容

  • 没有找到相关文章

最新更新