如何在我的ANTLR3语法中消除以下多个可选警告?

如何在我的ANTLR3语法中消除以下多个可选警告?,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,我希望能够在其他函数中嵌套函数 [11:45:19] warning(200): mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input [11:45:19] warning(200): C:\Users\Jarrod Roberson\mygramma

我希望能够在其他函数中嵌套函数

[11:45:19] warning(200): mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
[11:45:19] warning(200): C:\Users\Jarrod Roberson\mygrammar.g:14:57: Decision can match input such as "','" using multiple alternatives: 1, 2
As a result, alternative(s) 2 were disabled for that input
这是它抱怨的那条线

myfunction(x) ->
  sqr(a) -> a * a,
  y -> sqr(x).
以下是它正在考虑的替代方案

function : ID '(' args ')' '->' statement (',' statement)* ;
我使用
作为我的语句结束规则

statement : ATOM
          | expression
          | assignment
          | function
          ;
以下是AntlWorks中的synatx图


(来源:)

我真的很喜欢在没有任何警告的情况下编译/工作。如何解决此警告条件

贾罗德·罗伯森写道:

我真的很喜欢在没有任何警告的情况下编译/工作。如何解决此警告条件

您的解析器可以解析以下输入:

program : (statement'.')*;
在两个不同的解析树中:

以及:

您可以通过强制解析器向前看,并确保在实际匹配这些规则之前前面有
,”语句
,来解决这个问题。您可以通过使用语法谓词(
(…)=>
部分)来实现这一点,其中包含所述规则:

f(x)-> g(y)-> y*y, x=y
但是,如果
函数
规则具有某种尚未定义的“end”标记,则不需要谓词。根据您前面的问题和示例:

function
  :  ID '(' args ')' '->' statement ((',' statement)=> ',' statement)* 
  ;
您似乎正在使用
作为
函数的结尾。如果将其添加到
函数中
规则:

myfunction(x) ->
  sqr(a) -> a * a,
  y = sqr(x).

你根本不需要谓词。

@JarrodRoberson,请随意发布一个关于这个问题的新问题(如果你被卡住了,那就是…)。函数末尾的
是我的
程序
规则的一部分<代码>程序:(语句“)*不是函数规则的一部分,这样它是一致的。@JarrodRoberson,啊,我明白了。通过查看树图像,我希望能够清楚地了解ANTLR抱怨的原因:一个
函数
也必须有一个明显的结尾。通过使用谓词,我相信第一个图像中的树将被创建(因此,图像2中的树永远无法创建!)。我意识到我的示例strawman是错误的,它应该在
=
的位置有一个
->
。@JarrodRoberson,
->
=
不是这里的问题。不输入外来字符会使你的语法模棱两可。您是否了解解析器在解析
“f(x)->g(y)->y*y,x=y”时可以走两条“路”(参见图片)?这是因为您没有明确定义
函数的结束时间。因为您没有这样做,最后一条语句
x=y
(或者
x->y
,这无关紧要)可以放在函数
f
下,也可以放在函数
g
下。通过添加谓词,您只需抑制警告,而应该正确地处理它(修复语法/语言)。
function
  :  ID '(' args ')' '->' statement (',' statement)* '.'
  ;