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.”标识符参数。将其转移到新规则中将不起作用,因为它将使用间接的左递归。