出于我自己的兴趣,我正在编写一个ANSI SQL Lexer。具体地说,我正在努力符合ISO/IEC 9075-2:2003(E)。我在令牌阶段遇到了一些模棱两可的问题。
lexical element部分定义间隔字符串,如下所示:
<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 a,还是
理论上我可以这样写:选择'30‘
我创建了一个YearsValue令牌和一个MonthsValue令牌(类)。然而,模棱两可是一个问题,它两者都匹配。在ISO/IEC9075的第1部分或第2部分中,我没有看到任何专门处理多个匹配的内容。
有人能指出这是在规范中的什么地方处理的吗?或者只是假设从左到右?
在有人问起之前,我这么做是因为我想写一个SQL词法分析器。这不是用来上学的,只是用来教育我自己的。我也不想用GOLD或ANTLR。
发布于 2012-02-09 03:50:16
是不带选项的30a,还是a?
根据我对SQL2003草案的阅读,它在某种程度上是模棱两可的,并不重要。是的,语法没有指定INTERVAL '1' YEAR中的1是<years value>还是<months value>,甚至是<days value>,但这真的无关紧要。对如何解释YEAR的描述很清楚,即使1被解析为<months value>,它也是若干年。该标准规定,值中的第一个分量映射到interval类型中的第一个字段类型:
5.3
一般规则
7)或中的第i个datetime组件将datetime组件的值赋给或中的第i个。
https://stackoverflow.com/questions/9199265
复制相似问题