私自身の利益のために、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も使いたくない。