使递归 antlr4 规则变得贪婪

Making a recursive antlr4 rule greedy

我想要一个语法,其中 filter 可以是 operation 或由 | 连接的任意数量的过滤器。我的语法是这样的:

filter
  : filter ('|' filter)+  #pipedFilter
  | OPERATION             #operation
  ;


OPERATION
  : [a-z]+
  ;

(这是一个简化的示例,还有其他方法可以对优先级与管道不同的过滤器进行分组)

对于像 xxx|yyy 这样的输入,这工作正常,我们得到:

FILTER: [
  OPERATION: xxx,
  OPERATION: yyy
]

但是对于 xxx|yyy|zzz 的输入,我们得到:

FILTER: [
  OPERATION: xxx,
  FILTER: [
    OPERATION: yyy,
    OPERATION: zzz
  ]
]

我想

FILTER: [
  OPERATION: xxx,
  OPERATION: yyy,
  OPERATION: zzz
]

这两种解释似乎都有道理,但我更喜欢第二种。在我看来,问题在于 #pipedFilter 规则没有被尽可能地贪婪地应用。我的理解在这里正确吗?可以解决什么问题?

这与贪婪无关。 ANTLR4默认是在一条规则中尽可能多的匹配。

您获得的输出结构由您的语法决定。如果您不想要树,请不要将 filter 设为递归规则。有什么反对这样写过滤器的:

filter:
    OPERATION (PIPE OPERATION)?

如果您绝对需要包含过滤器的过滤器,那么恐怕没有办法绕过类似结果的树。