CUBRID Engine  latest
load_lexer.l
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
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
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  */
18 
19 /*
20  * load_lexer.l - loader lexer file
21  */
22 
23 /*** C/C++ Declarations ***/
24 %{
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"
30 
31 #undef YY_DECL
32 #define YY_DECL \
33  int cubload::scanner::yylex (cubload::parser::semantic_type* yylval, cubload::parser::location_type* yylloc)
34 
35 /* typedef to make the returns for the tokens shorter */
36 using token = cubload::parser::token;
37 
38 /*#define LEXER_DEBUG*/
39 
40 #ifdef LEXER_DEBUG
41 #define PRINT printf("lex: ");printf
42 #else
43 #define PRINT(a, b)
44 #endif
45 
46 #define CHECK_NULL_AND_SET_ERROR(p) \
47  do { \
48  if ((p) == NULL) { \
49  ASSERT_ERROR (); \
50  YY_FATAL_ERROR (er_msg ()); \
51  } \
52  } while (0) \
53 %}
54 
55 /*** Flex Declarations and Options ***/
56 /* enable c++ scanner class generation */
57 %option c++
58 
59 /* the manual says "somewhat more optimized" */
60 %option batch
61 
62 /* current buffer is considered never-interactive */
63 %option never-interactive
64 
65 %option yylineno
66 %option nodefault
67 %option noyywrap
68 %option nounput
69 %option noinput
70 %option nounistd
71 
72 %option yyclass="cubload::scanner"
73 
74 %x BRACKET_ID DELIMITED_ID DQS SQS COMMENT
75 
76 %%
77 [ \t]+ ;
78 
79 \r?\n {
80  return token::NL;
81 }
82 
83 [Nn][Uu][Ll][Ll] {
84  PRINT ("NULL_ %s\n", yytext);
85  return token::NULL_;
86 }
87 
88 [Cc][Ll][Aa][Ss][Ss] {
89  PRINT ("CLASS %s\n", yytext);
90  return token::CLASS;
91 }
92 
93 [Ss][Hh][Aa][Rr][Ee][Dd] {
94  PRINT ("SHARED %s\n", yytext);
95  return token::SHARED;
96 }
97 
98 [Dd][Ee][Ff][Aa][Uu][Ll][Tt] {
99  PRINT ("DEFAULT%s\n", yytext);
100  return token::DEFAULT;
101 }
102 
103 [Dd][Aa][Tt][Ee] {
104  PRINT ("DATE %s\n", yytext);
105  return token::DATE_;
106 }
107 
108 [Tt][Ii][Mm][Ee] {
109  PRINT ("TIME %s\n", yytext);
110  return token::TIME;
111 }
112 
113 [Uu][Tt][Ii][Mm][Ee] {
114  PRINT ("UTIME %s\n", yytext);
115  return token::UTIME;
116 }
117 
118 [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp] {
119  PRINT ("TIMESTAMP %s\n", yytext);
120  return token::TIMESTAMP;
121 }
122 
123 [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp][lL][tT][zZ] {
124  PRINT ("TIMESTAMPLTZ %s\n", yytext);
125  return token::TIMESTAMPLTZ;
126 }
127 
128 [Tt][Ii][Mm][Ee][Ss][Tt][Aa][Mm][Pp][tT][zZ] {
129  PRINT ("TIMESTAMPTZ %s\n", yytext);
130  return token::TIMESTAMPTZ;
131 }
132 
133 [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee] {
134  PRINT ("DATETIME %s\n", yytext);
135  return token::DATETIME;
136 }
137 
138 [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee][lL][tT][zZ] {
139  PRINT ("DATETIMELTZ %s\n", yytext);
140  return token::DATETIMELTZ;
141 }
142 
143 [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee][tT][zZ] {
144  PRINT ("DATETIMETZ %s\n", yytext);
145  return token::DATETIMETZ;
146 }
147 
148 \%[Ii][Dd] {
149  PRINT ("CMD_ID %s\n", yytext);
150  m_semantic_helper.set_in_instance_line (false);
151  return token::CMD_ID;
152 }
153 
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;
158 }
159 
160 \%[Cc][Oo][Nn][Ss][Tt][Rr][Uu][Cc][Tt][Oo][Rr] {
161  PRINT ("CMD_CONSTRUCTOR %s\n", yytext);
162  return token::CMD_CONSTRUCTOR;
163 }
164 
165 \^[Ii] {
166  PRINT ("REF_ELO_INT %s\n", yytext);
167  return token::REF_ELO_INT;
168 }
169 
170 \^[Ee] {
171  PRINT ("REF_ELO_EXT %s\n", yytext);
172  return token::REF_ELO_EXT;
173 }
174 
175 \^[Uu] {
176  PRINT ("REF_USER %s\n", yytext);
177  return token::REF_USER;
178 }
179 
180 \^[Cc] {
181  PRINT ("REF_CLASS %s\n", yytext);
182  return token::REF_CLASS;
183 }
184 
185 \@ {
186  PRINT ("OBJECT_REFERENCE %s\n", yytext);
187  return token::OBJECT_REFERENCE;
188 }
189 
190 \| {
191  PRINT ("OID_DELIMETER %s\n", yytext);
192  return token::OID_DELIMETER;
193 }
194 
195 \{ {
196  PRINT ("SET_START_BRACE %s\n", yytext);
197  return token::SET_START_BRACE;
198 }
199 
200 \} {
201  PRINT ("SET_END_BRACE %s\n", yytext);
202  return token::SET_END_BRACE;
203 }
204 
205 \( {
206  PRINT ("START_PAREN %s\n", yytext);
207  return token::START_PAREN;
208 }
209 
210 \) {
211  PRINT ("END_PAREN %s\n", yytext);
212  return token::END_PAREN;
213 }
214 
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;
219 }
220 
221 [\+\-]?[0-9]+ {
222  PRINT ("INT_LIT %s\n", yytext);
223  yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
224  return token::INT_LIT;
225 }
226 
227 [0-9]+: {
228  PRINT ("OID %s\n", yytext);
229  yylval->int_val = atoi (yytext);
230  return token::OID_;
231 }
232 
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;
237 }
238 
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;
243 }
244 
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;
249 }
250 
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;
255 }
256 
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;
261 }
262 
263 [0-9]+:[0-9]+ {
264  PRINT ("TIME_LIT1 %s\n", yytext);
265  yylval->string = m_semantic_helper.make_string_by_yytext (yytext, yyleng);
266  return token::TIME_LIT1;
267 }
268 
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;
273 }
274 
275 \xa1\xef {
276  PRINT ("YEN_SYMBOL %s\n", yytext);
277  return token::YEN_SYMBOL;
278 }
279 
280 \\[J][P][Y] {
281  PRINT ("YEN_SYMBOL %s\n", yytext);
282  return token::YEN_SYMBOL;
283 }
284 
285 \\[K][R][W] {
286  PRINT ("WON_SYMBOL %s\n", yytext);
287  return token::WON_SYMBOL;
288 }
289 
290 \xa3\xdc {
291  PRINT ("WON_SYMBOL %s\n", yytext);
292  return token::WON_SYMBOL;
293 }
294 
295 \\[T][L] {
296  PRINT ("TURKISH_LIRA_CURRENCY %s\n", yytext);
297  return token::TURKISH_LIRA_CURRENCY;
298 }
299 
300 \\[T][R][Y] {
301  PRINT ("TURKISH_LIRA_CURRENCY %s\n", yytext);
302  return token::TURKISH_LIRA_CURRENCY;
303 }
304 
305 \\[G][B][P] {
306  PRINT ("BRITISH_POUND_SYMBOL %s\n", yytext);
307  return token::BRITISH_POUND_SYMBOL;
308 }
309 
310 \\[K][H][R] {
311  PRINT ("CAMBODIAN_RIEL_SYMBOL %s\n", yytext);
312  return token::CAMBODIAN_RIEL_SYMBOL;
313 }
314 
315 \\[C][N][Y] {
316  PRINT ("CHINESE_RENMINBI_SYMBOL %s\n", yytext);
317  return token::CHINESE_RENMINBI_SYMBOL;
318 }
319 
320 \\[I][N][R] {
321  PRINT ("INDIAN_RUPEE_SYMBOL %s\n", yytext);
322  return token::INDIAN_RUPEE_SYMBOL;
323 }
324 
325 \\[R][U][B] {
326  PRINT ("RUSSIAN_RUBLE_SYMBOL %s\n", yytext);
327  return token::RUSSIAN_RUBLE_SYMBOL;
328 }
329 
330 \\[A][U][D] {
331  PRINT ("AUSTRALIAN_DOLLAR_SYMBOL %s\n", yytext);
332  return token::AUSTRALIAN_DOLLAR_SYMBOL;
333 }
334 
335 \\[C][A][D] {
336  PRINT ("CANADIAN_DOLLAR_SYMBOL %s\n", yytext);
337  return token::CANADIAN_DOLLAR_SYMBOL;
338 }
339 
340 \\[B][R][L] {
341  PRINT ("BRASILIAN_REAL_SYMBOL %s\n", yytext);
342  return token::BRASILIAN_REAL_SYMBOL;
343 }
344 
345 \\[R][O][N] {
346  PRINT ("ROMANIAN_LEU_SYMBOL %s\n", yytext);
347  return token::ROMANIAN_LEU_SYMBOL;
348 }
349 
350 \\[E][U][R] {
351  PRINT ("EURO_SYMBOL %s\n", yytext);
352  return token::EURO_SYMBOL;
353 }
354 
355 \\[C][H][F] {
356  PRINT ("SWISS_FRANC_SYMBOL %s\n", yytext);
357  return token::SWISS_FRANC_SYMBOL;
358 }
359 
360 \\[D][K][K] {
361  PRINT ("DANISH_KRONE_SYMBOL %s\n", yytext);
362  return token::DANISH_KRONE_SYMBOL;
363 }
364 
365 \\[N][O][K] {
366  PRINT ("NORWEGIAN_KRONE_SYMBOL %s\n", yytext);
367  return token::NORWEGIAN_KRONE_SYMBOL;
368 }
369 
370 \\[B][G][N] {
371  PRINT ("BULGARIAN_LEV_SYMBOL %s\n", yytext);
372  return token::BULGARIAN_LEV_SYMBOL;
373 }
374 
375 \\[V][N][D] {
376  PRINT ("VIETNAMESE_DONG_SYMBOL %s\n", yytext);
377  return token::VIETNAMESE_DONG_SYMBOL;
378 }
379 
380 \\[C][Z][K] {
381  PRINT ("CZECH_KORUNA_SYMBOL %s\n", yytext);
382  return token::CZECH_KORUNA_SYMBOL;
383 }
384 
385 \\[P][L][N] {
386  PRINT ("POLISH_ZLOTY_SYMBOL %s\n", yytext);
387  return token::POLISH_ZLOTY_SYMBOL;
388 }
389 
390 \\[S][E][K] {
391  PRINT ("SWEDISH_KRONA_SYMBOL %s\n", yytext);
392  return token::SWEDISH_KRONA_SYMBOL;
393 }
394 
395 \\[H][R][K] {
396  PRINT ("CROATIAN_KUNA_SYMBOL %s\n", yytext);
397  return token::CROATIAN_KUNA_SYMBOL;
398 }
399 
400 \\[R][S][D] {
401  PRINT ("SERBIAN_DINAR_SYMBOL %s\n", yytext);
402  return token::SERBIAN_DINAR_SYMBOL;
403 }
404 
405 \\ {
406  PRINT ("BACKSLASH %s\n", yytext);
407  return token::BACKSLASH;
408 }
409 
410 \$ {
411  PRINT ("DOLLAR_SYMBOL %s\n", yytext);
412  return token::DOLLAR_SYMBOL;
413 }
414 
415 \\[U][S][D] {
416  PRINT ("DOLLAR_SYMBOL %s\n", yytext);
417  return token::DOLLAR_SYMBOL;
418 }
419 
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;
424 }
425 
426 [\'] {
427  PRINT ("Quote %s\n", yytext);
428  BEGIN SQS;
429  m_semantic_helper.set_quoted_string_buffer ();
430  return token::Quote;
431 }
432 
433 [nN][\'] {
434  PRINT ("NQuote %s\n", yytext);
435  BEGIN SQS;
436  m_semantic_helper.set_quoted_string_buffer ();
437  return token::NQuote;
438 }
439 
440 [bB][\'] {
441  PRINT ("BQuote %s\n", yytext);
442  BEGIN SQS;
443  m_semantic_helper.set_quoted_string_buffer ();
444  return token::BQuote;
445 }
446 
447 [xX][\'] {
448  PRINT ("XQuote %s\n", yytext);
449  BEGIN SQS;
450  m_semantic_helper.set_quoted_string_buffer ();
451  return token::XQuote;
452 }
453 
454 \" {
455  m_semantic_helper.set_quoted_string_buffer ();
456  if (m_semantic_helper.in_instance_line ())
457  {
458  BEGIN DQS;
459  return token::DQuote;
460  }
461  else
462  {
463  BEGIN DELIMITED_ID;
464  }
465 }
466 
467 "[" {
468  m_semantic_helper.set_quoted_string_buffer ();
469  BEGIN BRACKET_ID;
470 }
471 
472 \\\n {
473  /* continue line */ ;
474 }
475 
476 "," {
477  PRINT ("COMMA %s\n", yytext);
478  return token::COMMA;
479 }
480 
481 \/\/[^\r\n]*\r?\n {
482  /* C++ comments */
483 }
484 
485 \-\-[^\r\n]*\r?\n {
486  /* SQL comments */
487 }
488 
489 "/*" {
490  BEGIN COMMENT; /* C comments */
491 }
492 
493 <COMMENT>. |
494 <COMMENT>\n {
495 }
496 
497 <COMMENT>"*/" {
498  BEGIN INITIAL;
499 }
500 
501 <DELIMITED_ID>\"\" {
502  m_semantic_helper.append_char ('"');
503 }
504 
505 <DELIMITED_ID>[^\"] {
506  m_semantic_helper.append_char (yytext[0]);
507 }
508 
509 <DELIMITED_ID>\" {
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);
514  BEGIN INITIAL;
515  return token::IDENTIFIER;
516 }
517 
518 <BRACKET_ID>[^\]] {
519  m_semantic_helper.append_char (yytext[0]);
520 }
521 
522 <BRACKET_ID>"]" {
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);
527  BEGIN INITIAL;
528  return token::IDENTIFIER;
529 }
530 
531 <DQS>\\n {
532  m_semantic_helper.append_char ('\n');
533 }
534 
535 <DQS>\\t {
536  m_semantic_helper.append_char ('\t');
537 }
538 
539 <DQS>\\f {
540  m_semantic_helper.append_char ('\f');
541 }
542 
543 <DQS>\\r {
544  m_semantic_helper.append_char ('\r');
545 }
546 
547 <DQS>\\[0-7]([0-7][0-7]?)? {
548  m_semantic_helper.append_char ((char) strtol (&yytext[1], NULL, 8));
549 }
550 
551 <DQS>\\x[0-9a-fA-F][0-9a-fA-F]? {
552  m_semantic_helper.append_char ((char) strtol (&yytext[2], NULL, 16));
553 }
554 
555 <DQS>[^\"] {
556  m_semantic_helper.append_char (yytext[0]);
557 }
558 
559 <DQS>\\ {
560  /* ignore */ ;
561 }
562 
563 <DQS>\" {
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);
568  BEGIN INITIAL;
569  return token::DQS_String_Body;
570 }
571 
572 <SQS>\'\' {
573  m_semantic_helper.append_char ('\'');
574 }
575 
576 <SQS>[^\'] {
577  m_semantic_helper.append_char (yytext[0]);
578 }
579 
580 <SQS>\'\+[ \t]*\r?\n[ \t]*\' {
581 }
582 
583 <SQS>\'[ \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);
588  BEGIN INITIAL;
589  return token::SQS_String_Body;
590 }
591 
592 <SQS>\' {
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);
597  BEGIN INITIAL;
598  return token::SQS_String_Body;
599 }
600 
601 %%
602 
603 /*** Additional Code ***/