为了我自己的利益,我正在编写一个 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。