Java 我如何告诉ANTLR选择一种替代方案?

Java 我如何告诉ANTLR选择一种替代方案?,java,parsing,antlr,grammar,antlr4,Java,Parsing,Antlr,Grammar,Antlr4,我有以下作品: expression : primary # stubLabel | expression '.' Identifier # stubLabel | expression '.' 'this' # stubLabel | expression '.' 'new' nonWildcardTypeArguments? innerCreator # stubLabel | expression '.' 'super' supe

我有以下作品:

expression
    :   primary # stubLabel
    |   expression '.' Identifier # stubLabel
    |   expression '.' 'this' # stubLabel
    |   expression '.' 'new' nonWildcardTypeArguments? innerCreator # stubLabel
    |   expression '.' 'super' superSuffix # stubLabel
    |   expression '.' explicitGenericInvocation # stubLabel
    |   expression '[' expression ']' # stubLabel
    |   Identifier arguments # namedMethodInvocation
    |   expression '.' Identifier arguments # namedMethodInvocation
    |   expression arguments # unnamedMethodInvocation
    |   // Lots of other patterns...
    ;
我希望让解析器在尝试
unnamedMethodInvocation
之前先尝试
namedMethodInvocation
模式。这不会自动发生,因为ANTLR尝试选择匹配时间最长的备选方案,而不是使用第一个匹配策略。我怎么能强迫它这么做


编辑:对不起,我忘了发布上面语法文件的链接。是的。

试着像这样将
名称方法职业
移动到
主要
生产规则(在
标识符
之前)

primary
    :   '(' expression ')'
    |   'this'
    |   'super'
    |   literal
    |   Identifier arguments // namedMethodInvocation
    |   Identifier
    |   typeType '.' 'class'
    |   'void' '.' 'class'
    |   nonWildcardTypeArguments (explicitGenericInvocationSuffix | 'this' arguments)
    ;
或将
表达式中的
移动到最后一个

expression
    : expression '.' Identifier
    .....
    | Identifier arguments  // namedMethodInvocation
    | expression arguments  // unnamedMethodInvocation
    .....
    | primary
    ;
expression
    : primaryOrNamedMethodInvocation
    | expression '.' Identifier
    .....
    ;

primaryOrNamedMethodInvocation
    : Identifier arguments  // namedMethodInvocation
    | primary
    ;
或插入新规则
Primary或NamedMethodInvocation

expression
    : expression '.' Identifier
    .....
    | Identifier arguments  // namedMethodInvocation
    | expression arguments  // unnamedMethodInvocation
    .....
    | primary
    ;
expression
    : primaryOrNamedMethodInvocation
    | expression '.' Identifier
    .....
    ;

primaryOrNamedMethodInvocation
    : Identifier arguments  // namedMethodInvocation
    | primary
    ;

请发布
primary
production rule.@saka1029很抱歉,我在帖子中忽略了链接到完整的语法文件!可以找到语法文件。
primary
生成规则是。在解析器规则中,alt逐个测试,从上到下顺序(如语法中所述),第一个匹配的alt获胜。Alts排序本身就是一个问题,因为它决定了很多事情(例如优先级)。Saka129,我不想这样做,因为将
namedMethodInvocation
作为主要职业毫无意义
namedMethodInvocation
应该匹配像
foo.bar()
这样的表达式,这太复杂了,无法作为主要表达式。添加了另一个解决方案。saka1029,我认为这不会影响结果,因为ANTLR选择替代方案是基于它的长度,而不是它在生产中的顺序。添加了另一个解决方案。saka1029,closer,谢谢你的帮助。但是,我还需要处理
namedMethodInvocation
expression.”标识符参数。将其转移到新规则中将不起作用,因为它将使用间接的左递归。