我想解析ANTLR中的各种SQL文本。文字的例子有:
DATE '2020-01-01'
DATE '1992-11-23'
DATE '2014-01-01'
最好在解析阶段做"最低限度",然后放一些类似的东西:
date_literal
: 'DATE' STRING
;
或者,我是否也应该在解析器中进行任何验证,例如:
date_literal
: 'DATE' DIG DIG DIG DIG '-' DIG DIG '-' DIG DIG
如果我做了后者,我仍然需要验证。。。即使我做了一个更长的正则表达式,我也需要检查月份的天数、闰年、有效的日期范围等。
通常最好的方法是什么?和中一样,你想在语法中做多少"验证",在实际编程的监听器中做多少?此外,"在语法中"进行(小(验证与在侦听器/跟随器中进行验证之间是否存在性能差异?
这实际上是两种略有不同的语法(第二种语法没有指定日期应该被'
s包围(
根据您的示例,这可能是一个疏忽,所以我假设您的意思是两者都需要'
,并且您的STRING
是由'
分隔的。
这是一个设计选择,但有几个因素需要考虑。
- 如果你使用更具体的语法,那么,如果用户输入不匹配,你会得到默认的ANTLR错误消息(这对生成的工具来说很好,但对用户来说可能有点迟钝(
- 正如您所说,您仍然需要执行进一步的编辑
我倾向于保持语法尽可能简单,并在听众(可能是访问者(中进行更多验证。这使您能够尽可能清楚地了解错误消息。
我认为不使用'DATE' STRING
规则的唯一原因是,如果有其他字符串内容不是date_literal
,而是您的语言中的其他有效语法。它可能是一个无效的日期文字,在这种情况下,我会使用您的简单规则并进行编辑。