2

私自身の利益のために、ANSISQLLexerを作成しています。具体的には、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はオプションなしの<年の値>ですか、それとも<月の値>ですか?

理論的には次のように書くことができます:SELECT '30'

YearsValueトークンとMonthsValueトークン(クラス)を作成しました。ただし、あいまいさは問題であり、両方に一致します。ISO /IEC9075のパート1またはパート2で複数の一致を具体的に扱っているものは見当たりません。

誰かがこれが仕様のどこで処理されているかを指摘できますか、それとも左から右に想定されていますか?

誰かが尋ねる前に、私はSQLレクサーを書きたいので、これを行っています。それは学校のためではなく、自分自身を教育するための何かです。GOLDもANTLRも使いたくない。

4

1 に答える 1

1

30はオプションなしの<年の値>ですか、それとも<月の値>ですか?

SQL 2003のドラフトを読んだところ、問題にならないようにあいまいなままになっています。はい、文法はinがaであるか、1INTERVAL '1' YEARある<years value><months value>、あるいはおそらくであるかを指定しません<days value>が、それは実際には重要ではありません。YEARどのように解釈されるかの説明は、たとえそれが。として解析されたとしても1、何年もかかることは明らかです。標準では、値の最初のコンポーネントが間隔タイプの最初のフィールドタイプにマップされるとされています。<months value>

5.3<リテラル>

一般的なルール

7)<datetimeliteral>または<intervalliteral>のi番目のdatetimeコンポーネントは、datetimeコンポーネントの値を<datetimeliteral>または<intervalliteral>のi番目の<primarydatetimefield>に割り当てます。

于 2012-02-08T19:50:16.130 に答える