2 * Copyright 2008 Search Solution Corporation
3 * Copyright 2016 CUBRID Corporation
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
20 * load_lexer.l - loader lexer file
23 /*** C/C++ Declarations ***/
25 #include "load_driver.hpp"
26 #include "load_grammar.hpp"
27 #include "load_scanner.hpp"
28 #include "error_manager.h"
29 #include "error_code.h"
33 int cubload::scanner::yylex (cubload::parser::semantic_type* yylval, cubload::parser::location_type* yylloc)
35 /* typedef to make the returns for the tokens shorter */
36 using token = cubload::parser::token;
38 /*#define LEXER_DEBUG*/
41 #define PRINT printf("lex: ");printf
46 #define CHECK_NULL_AND_SET_ERROR(p) \
50 YY_FATAL_ERROR (er_msg ()); \
55 /*** Flex Declarations and Options ***/
56 /* enable c++ scanner class generation */
59 /* the manual says "somewhat more optimized" */
62 /* current buffer is considered never-interactive */
63 %option never-interactive
72 %option yyclass="cubload::scanner"
74 %x BRACKET_ID DELIMITED_ID DQS SQS COMMENT
84 PRINT ("NULL_ %s\n", yytext);
88 [Cc][Ll][Aa][Ss][Ss] {
89 PRINT ("CLASS %s\n", yytext);
93 [Ss][Hh][Aa][Rr][Ee][Dd] {
94 PRINT ("SHARED %s\n", yytext);
98 [Dd][Ee][Ff][Aa][Uu][Ll][Tt] {
99 PRINT ("DEFAULT%s\n", yytext);
100 return token::DEFAULT;
104 PRINT ("DATE %s\n", yytext);
109 PRINT ("TIME %s\n", yytext);
113 [Uu][Tt][Ii][Mm][Ee] {
114 PRINT ("UTIME %s\n", yytext);
118 [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp] {
119 PRINT ("TIMESTAMP %s\n", yytext);
120 return token::TIMESTAMP;
123 [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp][lL][tT][zZ] {
124 PRINT ("TIMESTAMPLTZ %s\n", yytext);
125 return token::TIMESTAMPLTZ;
128 [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp][tT][zZ] {
129 PRINT ("TIMESTAMPTZ %s\n", yytext);
130 return token::TIMESTAMPTZ;
133 [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee] {
134 PRINT ("DATETIME %s\n", yytext);
135 return token::DATETIME;
138 [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee][lL][tT][zZ] {
139 PRINT ("DATETIMELTZ %s\n", yytext);
140 return token::DATETIMELTZ;
143 [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee][tT][zZ] {
144 PRINT ("DATETIMETZ %s\n", yytext);
145 return token::DATETIMETZ;
149 PRINT ("CMD_ID %s\n", yytext);
150 m_semantic_helper.set_in_instance_line (false);
151 return token::CMD_ID;
154 \%[Cc][Ll][Aa][Ss][Ss] {
155 PRINT ("CMD_CLASS %s\n", yytext);
156 m_semantic_helper.set_in_instance_line (false);
157 return token::CMD_CLASS;
160 \%[Cc][Oo][Nn][Ss][Tt][Rr][Uu][Cc][Tt][Oo][Rr] {
161 PRINT ("CMD_CONSTRUCTOR %s\n", yytext);
162 return token::CMD_CONSTRUCTOR;
166 PRINT ("REF_ELO_INT %s\n", yytext);
167 return token::REF_ELO_INT;
171 PRINT ("REF_ELO_EXT %s\n", yytext);
172 return token::REF_ELO_EXT;
176 PRINT ("REF_USER %s\n", yytext);
177 return token::REF_USER;
181 PRINT ("REF_CLASS %s\n", yytext);
182 return token::REF_CLASS;
186 PRINT ("OBJECT_REFERENCE %s\n", yytext);
187 return token::OBJECT_REFERENCE;
191 PRINT ("OID_DELIMETER %s\n", yytext);
192 return token::OID_DELIMETER;
196 PRINT ("SET_START_BRACE %s\n", yytext);
197 return token::SET_START_BRACE;
201 PRINT ("SET_END_BRACE %s\n", yytext);
202 return token::SET_END_BRACE;
206 PRINT ("START_PAREN %s\n", yytext);
207 return token::START_PAREN;
211 PRINT ("END_PAREN %s\n", yytext);
212 return token::END_PAREN;
215 [\+\-]?(([0-9]+[Ee][\+\-]?[0-9]+[fFlL]?)|([0-9]*\.[0-9]+([Ee][\+\-]?[0-9]+)?[fFlL]?)|([0-9]+\.[0-9]*([Ee][\+\-]?[0-9]+)?[fFlL]?)) {
216 PRINT ("REAL_LIT %s\n", yytext);
217 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
218 return token::REAL_LIT;
222 PRINT ("INT_LIT %s\n", yytext);
223 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
224 return token::INT_LIT;
228 PRINT ("OID %s\n", yytext);
229 yylval->int_val = atoi (yytext);
233 [0-9]+:[0-9]+:[0-9]+[\ \t]*[aApP][mM] {
234 PRINT ("TIME_LIT4 %s\n", yytext);
235 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
236 return token::TIME_LIT4;
239 [0-9]+:[0-9]+:[0-9]+[\ \t]* {
240 PRINT ("TIME_LIT42 %s\n", yytext);
241 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
242 return token::TIME_LIT42;
245 [0-9]+:[0-9]+[\ \t]*[aApP][mM] {
246 PRINT ("TIME_LIT3 %s\n", yytext);
247 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
248 return token::TIME_LIT3;
251 [0-9]+:[0-9]+[\ \t]* {
252 PRINT ("TIME_LIT31 %s\n", yytext);
253 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
254 return token::TIME_LIT31;
257 [0-9]+:[0-9]+:[0-9]+ {
258 PRINT ("TIME_LIT2 %s\n", yytext);
259 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
260 return token::TIME_LIT2;
264 PRINT ("TIME_LIT1 %s\n", yytext);
265 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
266 return token::TIME_LIT1;
269 [0-9]+\/[0-9]+\/[0-9]+ {
270 PRINT ("DATE_LIT2 %s\n", yytext);
271 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
272 return token::DATE_LIT2;
276 PRINT ("YEN_SYMBOL %s\n", yytext);
277 return token::YEN_SYMBOL;
281 PRINT ("YEN_SYMBOL %s\n", yytext);
282 return token::YEN_SYMBOL;
286 PRINT ("WON_SYMBOL %s\n", yytext);
287 return token::WON_SYMBOL;
291 PRINT ("WON_SYMBOL %s\n", yytext);
292 return token::WON_SYMBOL;
296 PRINT ("TURKISH_LIRA_CURRENCY %s\n", yytext);
297 return token::TURKISH_LIRA_CURRENCY;
301 PRINT ("TURKISH_LIRA_CURRENCY %s\n", yytext);
302 return token::TURKISH_LIRA_CURRENCY;
306 PRINT ("BRITISH_POUND_SYMBOL %s\n", yytext);
307 return token::BRITISH_POUND_SYMBOL;
311 PRINT ("CAMBODIAN_RIEL_SYMBOL %s\n", yytext);
312 return token::CAMBODIAN_RIEL_SYMBOL;
316 PRINT ("CHINESE_RENMINBI_SYMBOL %s\n", yytext);
317 return token::CHINESE_RENMINBI_SYMBOL;
321 PRINT ("INDIAN_RUPEE_SYMBOL %s\n", yytext);
322 return token::INDIAN_RUPEE_SYMBOL;
326 PRINT ("RUSSIAN_RUBLE_SYMBOL %s\n", yytext);
327 return token::RUSSIAN_RUBLE_SYMBOL;
331 PRINT ("AUSTRALIAN_DOLLAR_SYMBOL %s\n", yytext);
332 return token::AUSTRALIAN_DOLLAR_SYMBOL;
336 PRINT ("CANADIAN_DOLLAR_SYMBOL %s\n", yytext);
337 return token::CANADIAN_DOLLAR_SYMBOL;
341 PRINT ("BRASILIAN_REAL_SYMBOL %s\n", yytext);
342 return token::BRASILIAN_REAL_SYMBOL;
346 PRINT ("ROMANIAN_LEU_SYMBOL %s\n", yytext);
347 return token::ROMANIAN_LEU_SYMBOL;
351 PRINT ("EURO_SYMBOL %s\n", yytext);
352 return token::EURO_SYMBOL;
356 PRINT ("SWISS_FRANC_SYMBOL %s\n", yytext);
357 return token::SWISS_FRANC_SYMBOL;
361 PRINT ("DANISH_KRONE_SYMBOL %s\n", yytext);
362 return token::DANISH_KRONE_SYMBOL;
366 PRINT ("NORWEGIAN_KRONE_SYMBOL %s\n", yytext);
367 return token::NORWEGIAN_KRONE_SYMBOL;
371 PRINT ("BULGARIAN_LEV_SYMBOL %s\n", yytext);
372 return token::BULGARIAN_LEV_SYMBOL;
376 PRINT ("VIETNAMESE_DONG_SYMBOL %s\n", yytext);
377 return token::VIETNAMESE_DONG_SYMBOL;
381 PRINT ("CZECH_KORUNA_SYMBOL %s\n", yytext);
382 return token::CZECH_KORUNA_SYMBOL;
386 PRINT ("POLISH_ZLOTY_SYMBOL %s\n", yytext);
387 return token::POLISH_ZLOTY_SYMBOL;
391 PRINT ("SWEDISH_KRONA_SYMBOL %s\n", yytext);
392 return token::SWEDISH_KRONA_SYMBOL;
396 PRINT ("CROATIAN_KUNA_SYMBOL %s\n", yytext);
397 return token::CROATIAN_KUNA_SYMBOL;
401 PRINT ("SERBIAN_DINAR_SYMBOL %s\n", yytext);
402 return token::SERBIAN_DINAR_SYMBOL;
406 PRINT ("BACKSLASH %s\n", yytext);
407 return token::BACKSLASH;
411 PRINT ("DOLLAR_SYMBOL %s\n", yytext);
412 return token::DOLLAR_SYMBOL;
416 PRINT ("DOLLAR_SYMBOL %s\n", yytext);
417 return token::DOLLAR_SYMBOL;
420 ([a-zA-Z_%#]|(\xa1[\xa2-\xee\xf3-\xfe])|([\xa2-\xfe][\xa1-\xfe])|(\x8e[\xa1-\xfe]))([a-zA-Z_%#0-9]|(\xa1[\xa2-\xfe])|([\xa1-\xfe])|(\x8e[\xa1-\xfe]))* {
421 PRINT ("IDENTIFIER %s\n", yytext);
422 yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
423 return token::IDENTIFIER;
427 PRINT ("Quote %s\n", yytext);
429 m_semantic_helper.set_quoted_string_buffer ();
434 PRINT ("NQuote %s\n", yytext);
436 m_semantic_helper.set_quoted_string_buffer ();
437 return token::NQuote;
441 PRINT ("BQuote %s\n", yytext);
443 m_semantic_helper.set_quoted_string_buffer ();
444 return token::BQuote;
448 PRINT ("XQuote %s\n", yytext);
450 m_semantic_helper.set_quoted_string_buffer ();
451 return token::XQuote;
455 m_semantic_helper.set_quoted_string_buffer ();
456 if (m_semantic_helper.in_instance_line ())
459 return token::DQuote;
468 m_semantic_helper.set_quoted_string_buffer ();
473 /* continue line */ ;
477 PRINT ("COMMA %s\n", yytext);
490 BEGIN COMMENT; /* C comments */
502 m_semantic_helper.append_char ('"');
505 <DELIMITED_ID>[^\"] {
506 m_semantic_helper.append_char (yytext[0]);
510 m_semantic_helper.append_char ('\0');
511 // PRINT ("IDENTIFIER %s\n", qstr_Buf_p);
512 yylval->string = m_semantic_helper.make_string_by_buffer ();
513 CHECK_NULL_AND_SET_ERROR (yylval->string);
515 return token::IDENTIFIER;
519 m_semantic_helper.append_char (yytext[0]);
523 m_semantic_helper.append_char ('\0');
524 // PRINT ("IDENTIFIER %s\n", qstr_Buf_p);
525 yylval->string = m_semantic_helper.make_string_by_buffer ();
526 CHECK_NULL_AND_SET_ERROR (yylval->string);
528 return token::IDENTIFIER;
532 m_semantic_helper.append_char ('\n');
536 m_semantic_helper.append_char ('\t');
540 m_semantic_helper.append_char ('\f');
544 m_semantic_helper.append_char ('\r');
547 <DQS>\\[0-7]([0-7][0-7]?)? {
548 m_semantic_helper.append_char ((char) strtol (&yytext[1], NULL, 8));
551 <DQS>\\x[0-9a-fA-F][0-9a-fA-F]? {
552 m_semantic_helper.append_char ((char) strtol (&yytext[2], NULL, 16));
556 m_semantic_helper.append_char (yytext[0]);
564 m_semantic_helper.append_char ('\0');
565 // PRINT ("DQS_String_Body %s\n", qstr_Buf_p);
566 yylval->string = m_semantic_helper.make_string_by_buffer ();
567 CHECK_NULL_AND_SET_ERROR (yylval->string);
569 return token::DQS_String_Body;
573 m_semantic_helper.append_char ('\'');
577 m_semantic_helper.append_char (yytext[0]);
580 <SQS>\'\+[ \t]*\r?\n[ \t]*\' {
584 m_semantic_helper.append_char ('\0');
585 // PRINT ("String_Completion %s\n", qstr_Buf_p);
586 yylval->string = m_semantic_helper.make_string_by_buffer ();
587 CHECK_NULL_AND_SET_ERROR (yylval->string);
589 return token::SQS_String_Body;
593 m_semantic_helper.append_char ('\0');
594 // PRINT ("String_Completion2 %s\n", qstr_Buf_p);
595 yylval->string = m_semantic_helper.make_string_by_buffer ();
596 CHECK_NULL_AND_SET_ERROR (yylval->string);
598 return token::SQS_String_Body;
603 /*** Additional Code ***/