ANSI Sql 2003 Lexing间隔

时间:2012-02-08 18:29:13

标签: sql ansi-sql

为了我自己的兴趣,我正在编写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 a&lt; years value&gt;没有选择 或者它是&lt;月值&gt;?

理论上我可以写: 选择'30'

我创建了一个YearsValue标记和一个MonthsValue标记(类)。然而,歧义是一个问题,它匹配两者。在ISO / IEC 9075的第1部分或第2部分中,我没有看到任何具体涉及多个匹配的内容。

有人可以指出规范中的处理方式,还是从左到右假设?

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

1 个答案:

答案 0 :(得分:1)

  

30 a&lt; years value&gt;没有选项或者是&lt; months value&gt;?

根据我对SQL 2003草案的阅读,它以一种无关紧要的方式保持模棱两可。是的,语法没有指定1中的INTERVAL '1' YEAR<years value>还是<months value>,甚至可能是<days value>,但实际上并非如此物。有关如何解释YEAR的说明很清楚1是多年,即使它被解析为<months value> 。标准表示值中的第一个组件映射到区间类型中的第一个字段类型:

  

5.3&lt; literal&gt;

     

一般规则

     

7&lt; datetime literal&gt;中的 i -th datetime组件或&lt; interval literal&gt;将datetime组件的值分配给 i -th&lt; primary datetime字段&gt;在&lt; datetime literal&gt;中或&lt; interval literal&gt;。