antlr4 - 使递归 antlr4 规则变得贪婪
问题描述
我想要一个语法,其中 afilter
可以是一个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)?
如果您绝对需要包含过滤器的过滤器,那么恐怕没有办法绕过像结果一样的树。
推荐阅读
- typescript - TestCafe 能够选择禁用的复选框
- kotlin - 可变列表
和可变列表 - c++ - 是否可以在代码块 IDE 中添加资源文件 (.rc),就像在 Microsoft Visual Studio 中一样,使用 VC++ 在项目中包含图像
- angular - 从服务器加载翻译时,Ionic ngx-translate 存储翻译以供离线访问
- javascript - 如何在网站中制作这样的动画组件?
- java - 关系的 PSQLException 列不存在
- xamarin.forms - Xamarin ui 测试无法上传到 appcenter 错误 FORBIDEEN
- laravel-5 - Nesbot Carbon - 整月的差异?(拉拉维尔)
- node.js - Sequelize seeder:意外的标识符错误,没有堆栈跟踪进一步解释它
- javascript - 无法将 blob 上传到节点 js 后端