2

为了我自己的利益,我正在编写一个 ANSI SQL Lexer。具体来说,我正在尝试遵守 ISO/IEC 9075-2:2003(E)。我在令牌阶段遇到了一些模棱两可的问题。

词法元素部分定义了一个区间字符串,如下所示:

<interval string> ::= <quote> <unquoted interval string> <quote>
<unquoted interval string> ::= [ <sign> ] { <year-month literal> | <day-time literal> }
<year-month literal> ::= <years value> [ <minus sign> <months value> ]  | <months value>
<years value> ::= <datetime value>
<months value> ::= <datetime value>
<datetime value> ::= <unsigned integer>
<unsigned integer> ::= <digit>...
<digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

示例:“30”

30 是没有选项的 <years value> 还是 <months value>?

理论上我可以写: SELECT '30'

我创建了 YearsValue 令牌和 MonthsValue 令牌(类)。但是,歧义是一个问题,它与两者都匹配。在 ISO/IEC 9075 的第 1 部分或第 2 部分中,我没有看到任何专门处理多个匹配项的内容。

有人可以指出在规范中这是在哪里处理的,还是只是从左到右假设?

在有人问之前,我这样做是因为我想编写一个 SQL 词法分析器。它不是为了学校,它只是为了教育自己。我也不想使用 GOLD 或 ANTLR。

4

1 回答 1

1

30 是没有选项的 <years value> 还是 <months value>?

根据我对 SQL 2003 草案的阅读,它以一种无关紧要的方式变得模棱两可。是的,语法没有指定1inINTERVAL '1' YEAR是 a<years value>还是 a <months value>,甚至可能是 a <days value>,但这并不重要。对如何YEAR解释的描述很清楚,即1多年,即使它被解析为<months value>. 标准说值中的第一个组件映射到区间类型中的第一个字段类型:

5.3 <字面量>

通用规则

7) <datetime literal> 或 <interval literal> 中的第i个日期时间组件将日期时间组件的值分配给 <datetime literal> 或 <interval literal> 中的第i个 <primary datetime field>。

于 2012-02-08T19:50:16.130 回答