使递归 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)?
如果您绝对需要包含过滤器的过滤器,那么恐怕没有办法绕过类似结果的树。
我想要一个语法,其中 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)?
如果您绝对需要包含过滤器的过滤器,那么恐怕没有办法绕过类似结果的树。