parsing - ANTLR 模板化规则
问题描述
我正在使用 ANTLR 4 来解析 SQL 子集,目前,我遇到了一个问题。我需要一个具有以下结构的谓词规则:
predicate
:
expr relation expr
| between_clause
| predicate OR predicate
| predicate AND predicate
| '(' predicate ')'
;
这里的问题是一个expr
规则。有不同类型的谓词expr
应该有所不同,但保留了整个上述结构。
我想以predicate
某种方式对规则进行参数化,以自动为不同的谓词类型实例化几个规则(上面的规则expr
替换了特定类型)。
在 ANTLR 4 中可以吗?
PS我看到两个替代选项:
- 复制粘贴规则并手动
predicate
替换不同的规则expr
- 在规则中包含所有可能的替代方案,
expr
并验证它们中只有一种类型用于目标语言代码中的特定谓词
但他们两个看起来都够糟糕的了。第一种情况导致组合爆炸,第二种情况导致在语法层面接受很多不正确的谓词。
解决方案
在 ANTLR 4 中可以吗?
不,ANTLR 没有这样的功能。
您的两个选择正是这些事情在实践中通常是如何完成的。哪一个更可取取决于不同的替代品到底有多大expr
不同。
第二个导致在语法级别上接受许多不正确的谓词。
总会有一些你无法在语法中防止的错误类型,必须在单独的阶段进行处理。例如,类型错误或未声明的变量错误。所以让语法接受不正确的程序一点也不稀奇。
推荐阅读
- typescript - 为什么扩展索引泛型不允许赋值?
- python - Scrapy 选择器在 shell 中工作,但在蜘蛛中不起作用
- javascript - javascript对象字段设置输入值[object Object]而不是float
- php - 在 Gmail 邮件列表 API 中获取发件人电子邮件地址
- python - 将 Python Heroku 与 Firebase 集成
- angular - Promise.then() 不等待
- sql - Postgres/Redshift/SparkSQL 中的 SQL 执行差异
- java - 10秒的滑动窗口?
- python - 使用python搜索数组中一系列值的索引
- ios - 如何在 XCode11 上同时运行 2 个模拟器?