1 #line 16 "./Tokenizer.l" 2 // 3 // Copyright (c) 2011-2013 The ANGLE Project Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style license that can be 5 // found in the LICENSE file. 6 // 7 8 // This file is auto-generated by generate_parser.sh. DO NOT EDIT! 9 10 11 12 #line 13 "./Tokenizer.cpp" 13 14 #define YY_INT_ALIGNED short int 15 16 /* A lexical scanner generated by flex */ 17 18 #define FLEX_SCANNER 19 #define YY_FLEX_MAJOR_VERSION 2 20 #define YY_FLEX_MINOR_VERSION 5 21 #define YY_FLEX_SUBMINOR_VERSION 35 22 #if YY_FLEX_SUBMINOR_VERSION > 0 23 #define FLEX_BETA 24 #endif 25 26 /* First, we deal with platform-specific or compiler-specific issues. */ 27 28 /* begin standard C headers. */ 29 #include <stdio.h> 30 #include <string.h> 31 #include <errno.h> 32 #include <stdlib.h> 33 34 /* end standard C headers. */ 35 36 /* flex integer type definitions */ 37 38 #ifndef FLEXINT_H 39 #define FLEXINT_H 40 41 /* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ 42 43 #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L 44 45 /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, 46 * if you want the limit (max/min) macros for int types. 47 */ 48 #ifndef __STDC_LIMIT_MACROS 49 #define __STDC_LIMIT_MACROS 1 50 #endif 51 52 #include <inttypes.h> 53 typedef int8_t flex_int8_t; 54 typedef uint8_t flex_uint8_t; 55 typedef int16_t flex_int16_t; 56 typedef uint16_t flex_uint16_t; 57 typedef int32_t flex_int32_t; 58 typedef uint32_t flex_uint32_t; 59 typedef uint64_t flex_uint64_t; 60 #else 61 typedef signed char flex_int8_t; 62 typedef short int flex_int16_t; 63 typedef int flex_int32_t; 64 typedef unsigned char flex_uint8_t; 65 typedef unsigned short int flex_uint16_t; 66 typedef unsigned int flex_uint32_t; 67 #endif /* ! C99 */ 68 69 /* Limits of integral types. */ 70 #ifndef INT8_MIN 71 #define INT8_MIN (-128) 72 #endif 73 #ifndef INT16_MIN 74 #define INT16_MIN (-32767-1) 75 #endif 76 #ifndef INT32_MIN 77 #define INT32_MIN (-2147483647-1) 78 #endif 79 #ifndef INT8_MAX 80 #define INT8_MAX (127) 81 #endif 82 #ifndef INT16_MAX 83 #define INT16_MAX (32767) 84 #endif 85 #ifndef INT32_MAX 86 #define INT32_MAX (2147483647) 87 #endif 88 #ifndef UINT8_MAX 89 #define UINT8_MAX (255U) 90 #endif 91 #ifndef UINT16_MAX 92 #define UINT16_MAX (65535U) 93 #endif 94 #ifndef UINT32_MAX 95 #define UINT32_MAX (4294967295U) 96 #endif 97 98 #endif /* ! FLEXINT_H */ 99 100 #ifdef __cplusplus 101 102 /* The "const" storage-class-modifier is valid. */ 103 #define YY_USE_CONST 104 105 #else /* ! __cplusplus */ 106 107 /* C99 requires __STDC__ to be defined as 1. */ 108 #if defined (__STDC__) 109 110 #define YY_USE_CONST 111 112 #endif /* defined (__STDC__) */ 113 #endif /* ! __cplusplus */ 114 115 #ifdef YY_USE_CONST 116 #define yyconst const 117 #else 118 #define yyconst 119 #endif 120 121 /* Returned upon end-of-file. */ 122 #define YY_NULL 0 123 124 /* Promotes a possibly negative, possibly signed char to an unsigned 125 * integer for use as an array index. If the signed char is negative, 126 * we want to instead treat it as an 8-bit unsigned char, hence the 127 * double cast. 128 */ 129 #define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) 130 131 /* An opaque pointer. */ 132 #ifndef YY_TYPEDEF_YY_SCANNER_T 133 #define YY_TYPEDEF_YY_SCANNER_T 134 typedef void* yyscan_t; 135 #endif 136 137 /* For convenience, these vars (plus the bison vars far below) 138 are macros in the reentrant scanner. */ 139 #define yyin yyg->yyin_r 140 #define yyout yyg->yyout_r 141 #define yyextra yyg->yyextra_r 142 #define yyleng yyg->yyleng_r 143 #define yytext yyg->yytext_r 144 #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) 145 #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) 146 #define yy_flex_debug yyg->yy_flex_debug_r 147 148 /* Enter a start condition. This macro really ought to take a parameter, 149 * but we do it the disgusting crufty way forced on us by the ()-less 150 * definition of BEGIN. 151 */ 152 #define BEGIN yyg->yy_start = 1 + 2 * 153 154 /* Translate the current start state into a value that can be later handed 155 * to BEGIN to return to the state. The YYSTATE alias is for lex 156 * compatibility. 157 */ 158 #define YY_START ((yyg->yy_start - 1) / 2) 159 #define YYSTATE YY_START 160 161 /* Action number for EOF rule of a given start state. */ 162 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) 163 164 /* Special action meaning "start processing a new file". */ 165 #define YY_NEW_FILE pprestart(yyin ,yyscanner ) 166 167 #define YY_END_OF_BUFFER_CHAR 0 168 169 /* Size of default input buffer. */ 170 #ifndef YY_BUF_SIZE 171 #define YY_BUF_SIZE 16384 172 #endif 173 174 /* The state buf must be large enough to hold one state per character in the main buffer. 175 */ 176 #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) 177 178 #ifndef YY_TYPEDEF_YY_BUFFER_STATE 179 #define YY_TYPEDEF_YY_BUFFER_STATE 180 typedef struct yy_buffer_state *YY_BUFFER_STATE; 181 #endif 182 183 #ifndef YY_TYPEDEF_YY_SIZE_T 184 #define YY_TYPEDEF_YY_SIZE_T 185 typedef size_t yy_size_t; 186 #endif 187 188 #define EOB_ACT_CONTINUE_SCAN 0 189 #define EOB_ACT_END_OF_FILE 1 190 #define EOB_ACT_LAST_MATCH 2 191 192 #define YY_LESS_LINENO(n) 193 194 /* Return all but the first "n" matched characters back to the input stream. */ 195 #define yyless(n) \ 196 do \ 197 { \ 198 /* Undo effects of setting up yytext. */ \ 199 int yyless_macro_arg = (n); \ 200 YY_LESS_LINENO(yyless_macro_arg);\ 201 *yy_cp = yyg->yy_hold_char; \ 202 YY_RESTORE_YY_MORE_OFFSET \ 203 yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ 204 YY_DO_BEFORE_ACTION; /* set up yytext again */ \ 205 } \ 206 while ( 0 ) 207 208 #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) 209 210 #ifndef YY_STRUCT_YY_BUFFER_STATE 211 #define YY_STRUCT_YY_BUFFER_STATE 212 struct yy_buffer_state 213 { 214 FILE *yy_input_file; 215 216 char *yy_ch_buf; /* input buffer */ 217 char *yy_buf_pos; /* current position in input buffer */ 218 219 /* Size of input buffer in bytes, not including room for EOB 220 * characters. 221 */ 222 yy_size_t yy_buf_size; 223 224 /* Number of characters read into yy_ch_buf, not including EOB 225 * characters. 226 */ 227 yy_size_t yy_n_chars; 228 229 /* Whether we "own" the buffer - i.e., we know we created it, 230 * and can realloc() it to grow it, and should free() it to 231 * delete it. 232 */ 233 int yy_is_our_buffer; 234 235 /* Whether this is an "interactive" input source; if so, and 236 * if we're using stdio for input, then we want to use getc() 237 * instead of fread(), to make sure we stop fetching input after 238 * each newline. 239 */ 240 int yy_is_interactive; 241 242 /* Whether we're considered to be at the beginning of a line. 243 * If so, '^' rules will be active on the next match, otherwise 244 * not. 245 */ 246 int yy_at_bol; 247 248 int yy_bs_lineno; /**< The line count. */ 249 int yy_bs_column; /**< The column count. */ 250 251 /* Whether to try to fill the input buffer when we reach the 252 * end of it. 253 */ 254 int yy_fill_buffer; 255 256 int yy_buffer_status; 257 258 #define YY_BUFFER_NEW 0 259 #define YY_BUFFER_NORMAL 1 260 /* When an EOF's been seen but there's still some text to process 261 * then we mark the buffer as YY_EOF_PENDING, to indicate that we 262 * shouldn't try reading from the input source any more. We might 263 * still have a bunch of tokens to match, though, because of 264 * possible backing-up. 265 * 266 * When we actually see the EOF, we change the status to "new" 267 * (via pprestart()), so that the user can continue scanning by 268 * just pointing yyin at a new input file. 269 */ 270 #define YY_BUFFER_EOF_PENDING 2 271 272 }; 273 #endif /* !YY_STRUCT_YY_BUFFER_STATE */ 274 275 /* We provide macros for accessing buffer states in case in the 276 * future we want to put the buffer states in a more general 277 * "scanner state". 278 * 279 * Returns the top of the stack, or NULL. 280 */ 281 #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ 282 ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ 283 : NULL) 284 285 /* Same as previous macro, but useful when we know that the buffer stack is not 286 * NULL or when we need an lvalue. For internal use only. 287 */ 288 #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] 289 290 void pprestart (FILE *input_file ,yyscan_t yyscanner ); 291 void pp_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); 292 YY_BUFFER_STATE pp_create_buffer (FILE *file,int size ,yyscan_t yyscanner ); 293 void pp_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); 294 void pp_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner ); 295 void pppush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner ); 296 void pppop_buffer_state (yyscan_t yyscanner ); 297 298 static void ppensure_buffer_stack (yyscan_t yyscanner ); 299 static void pp_load_buffer_state (yyscan_t yyscanner ); 300 static void pp_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner ); 301 302 #define YY_FLUSH_BUFFER pp_flush_buffer(YY_CURRENT_BUFFER ,yyscanner) 303 304 YY_BUFFER_STATE pp_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner ); 305 YY_BUFFER_STATE pp_scan_string (yyconst char *yy_str ,yyscan_t yyscanner ); 306 YY_BUFFER_STATE pp_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner ); 307 308 void *ppalloc (yy_size_t ,yyscan_t yyscanner ); 309 void *pprealloc (void *,yy_size_t ,yyscan_t yyscanner ); 310 void ppfree (void * ,yyscan_t yyscanner ); 311 312 #define yy_new_buffer pp_create_buffer 313 314 #define yy_set_interactive(is_interactive) \ 315 { \ 316 if ( ! YY_CURRENT_BUFFER ){ \ 317 ppensure_buffer_stack (yyscanner); \ 318 YY_CURRENT_BUFFER_LVALUE = \ 319 pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ 320 } \ 321 YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ 322 } 323 324 #define yy_set_bol(at_bol) \ 325 { \ 326 if ( ! YY_CURRENT_BUFFER ){\ 327 ppensure_buffer_stack (yyscanner); \ 328 YY_CURRENT_BUFFER_LVALUE = \ 329 pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \ 330 } \ 331 YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ 332 } 333 334 #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) 335 336 /* Begin user sect3 */ 337 338 #define ppwrap(n) 1 339 #define YY_SKIP_YYWRAP 340 341 typedef unsigned char YY_CHAR; 342 343 typedef int yy_state_type; 344 345 #define yytext_ptr yytext_r 346 347 static yy_state_type yy_get_previous_state (yyscan_t yyscanner ); 348 static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner); 349 static int yy_get_next_buffer (yyscan_t yyscanner ); 350 static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner ); 351 352 /* Done after the current pattern has been matched and before the 353 * corresponding action - sets up yytext. 354 */ 355 #define YY_DO_BEFORE_ACTION \ 356 yyg->yytext_ptr = yy_bp; \ 357 yyleng = (yy_size_t) (yy_cp - yy_bp); \ 358 yyg->yy_hold_char = *yy_cp; \ 359 *yy_cp = '\0'; \ 360 yyg->yy_c_buf_p = yy_cp; 361 362 #define YY_NUM_RULES 38 363 #define YY_END_OF_BUFFER 39 364 /* This struct is not used in this scanner, 365 but its presence is necessary. */ 366 struct yy_trans_info 367 { 368 flex_int32_t yy_verify; 369 flex_int32_t yy_nxt; 370 }; 371 static yyconst flex_int16_t yy_accept[87] = 372 { 0, 373 0, 0, 0, 0, 39, 37, 34, 35, 35, 33, 374 7, 33, 33, 33, 33, 33, 33, 33, 33, 9, 375 9, 33, 33, 33, 8, 37, 33, 33, 3, 5, 376 5, 4, 34, 35, 19, 27, 20, 30, 25, 12, 377 23, 13, 24, 10, 2, 1, 26, 10, 9, 11, 378 11, 11, 11, 9, 14, 16, 18, 17, 15, 8, 379 36, 36, 31, 21, 32, 22, 3, 5, 6, 11, 380 10, 11, 1, 10, 11, 0, 10, 9, 28, 29, 381 0, 10, 10, 10, 10, 0 382 } ; 383 384 static yyconst flex_int32_t yy_ec[256] = 385 { 0, 386 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 387 2, 2, 4, 1, 1, 1, 1, 1, 1, 1, 388 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 389 1, 2, 5, 1, 6, 1, 7, 8, 1, 9, 390 9, 10, 11, 9, 12, 13, 14, 15, 16, 16, 391 16, 16, 16, 16, 16, 17, 17, 9, 9, 18, 392 19, 20, 9, 1, 21, 21, 21, 21, 22, 21, 393 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 394 23, 23, 23, 23, 23, 23, 23, 24, 23, 23, 395 9, 25, 9, 26, 23, 1, 21, 21, 21, 21, 396 397 22, 21, 23, 23, 23, 23, 23, 23, 23, 23, 398 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 399 23, 23, 9, 27, 9, 9, 1, 1, 1, 1, 400 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 401 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 402 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 403 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 404 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 405 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 406 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 407 408 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 409 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 410 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 411 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 412 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 413 1, 1, 1, 1, 1 414 } ; 415 416 static yyconst flex_int32_t yy_meta[28] = 417 { 0, 418 1, 1, 2, 2, 1, 1, 1, 1, 1, 3, 419 1, 1, 4, 1, 5, 5, 5, 1, 1, 1, 420 5, 5, 5, 5, 1, 1, 1 421 } ; 422 423 static yyconst flex_int16_t yy_base[92] = 424 { 0, 425 0, 0, 25, 27, 162, 163, 159, 163, 152, 132, 426 163, 131, 24, 163, 116, 22, 26, 31, 30, 37, 427 40, 44, 115, 46, 0, 64, 50, 15, 0, 163, 428 124, 91, 88, 163, 163, 163, 163, 163, 163, 163, 429 163, 163, 163, 64, 163, 0, 163, 76, 54, 58, 430 79, 91, 91, 0, 56, 163, 163, 163, 32, 0, 431 163, 36, 163, 163, 163, 163, 0, 163, 163, 94, 432 0, 106, 0, 0, 113, 55, 72, 113, 163, 163, 433 116, 101, 108, 123, 126, 163, 143, 31, 148, 153, 434 155 435 436 } ; 437 438 static yyconst flex_int16_t yy_def[92] = 439 { 0, 440 86, 1, 87, 87, 86, 86, 86, 86, 86, 86, 441 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 442 20, 86, 86, 86, 88, 86, 86, 86, 89, 86, 443 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 444 86, 86, 86, 86, 86, 90, 86, 86, 20, 20, 445 48, 51, 91, 21, 86, 86, 86, 86, 86, 88, 446 86, 86, 86, 86, 86, 86, 89, 86, 86, 44, 447 44, 70, 90, 48, 51, 86, 52, 91, 86, 86, 448 86, 72, 75, 86, 86, 0, 86, 86, 86, 86, 449 86 450 451 } ; 452 453 static yyconst flex_int16_t yy_nxt[191] = 454 { 0, 455 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 456 16, 17, 18, 19, 20, 21, 21, 22, 23, 24, 457 25, 25, 25, 25, 26, 27, 28, 30, 31, 30, 458 31, 37, 40, 65, 32, 60, 32, 42, 61, 45, 459 41, 66, 38, 46, 43, 44, 44, 44, 47, 48, 460 80, 49, 49, 50, 54, 54, 54, 51, 52, 51, 461 53, 55, 56, 51, 58, 59, 61, 62, 63, 84, 462 84, 84, 50, 50, 79, 64, 70, 51, 71, 71, 463 71, 51, 86, 86, 70, 72, 70, 70, 51, 33, 464 74, 74, 74, 51, 51, 51, 51, 75, 51, 51, 465 466 51, 76, 76, 51, 69, 77, 77, 77, 70, 70, 467 70, 86, 86, 51, 51, 70, 81, 81, 86, 86, 468 82, 82, 82, 81, 81, 51, 68, 83, 83, 83, 469 85, 85, 85, 57, 39, 51, 51, 84, 84, 84, 470 85, 85, 85, 29, 29, 29, 29, 29, 67, 36, 471 35, 67, 67, 73, 34, 73, 73, 73, 78, 78, 472 33, 86, 5, 86, 86, 86, 86, 86, 86, 86, 473 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 474 86, 86, 86, 86, 86, 86, 86, 86, 86, 86 475 } ; 476 477 static yyconst flex_int16_t yy_chk[191] = 478 { 0, 479 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 480 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 481 1, 1, 1, 1, 1, 1, 1, 3, 3, 4, 482 4, 13, 16, 28, 3, 88, 4, 17, 62, 19, 483 16, 28, 13, 19, 17, 18, 18, 18, 19, 20, 484 59, 20, 20, 20, 21, 21, 21, 20, 20, 20, 485 20, 22, 22, 21, 24, 24, 26, 26, 27, 76, 486 76, 76, 50, 50, 55, 27, 44, 49, 44, 44, 487 44, 50, 77, 77, 44, 44, 44, 44, 48, 33, 488 48, 48, 48, 51, 51, 51, 48, 48, 48, 48, 489 490 51, 52, 52, 53, 32, 52, 52, 52, 70, 70, 491 70, 82, 82, 53, 53, 70, 72, 72, 83, 83, 492 72, 72, 72, 75, 75, 78, 31, 75, 75, 75, 493 81, 81, 81, 23, 15, 78, 78, 84, 84, 84, 494 85, 85, 85, 87, 87, 87, 87, 87, 89, 12, 495 10, 89, 89, 90, 9, 90, 90, 90, 91, 91, 496 7, 5, 86, 86, 86, 86, 86, 86, 86, 86, 497 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 498 86, 86, 86, 86, 86, 86, 86, 86, 86, 86 499 } ; 500 501 /* The intent behind this definition is that it'll catch 502 * any uses of REJECT which flex missed. 503 */ 504 #define REJECT reject_used_but_not_detected 505 #define yymore() yymore_used_but_not_detected 506 #define YY_MORE_ADJ 0 507 #define YY_RESTORE_YY_MORE_OFFSET 508 /* 509 // 510 // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. 511 // Use of this source code is governed by a BSD-style license that can be 512 // found in the LICENSE file. 513 // 514 515 This file contains the Lex specification for GLSL ES preprocessor. 516 Based on Microsoft Visual Studio 2010 Preprocessor Grammar: 517 http://msdn.microsoft.com/en-us/library/2scxys89.aspx 518 519 IF YOU MODIFY THIS FILE YOU ALSO NEED TO RUN generate_parser.sh. 520 */ 521 522 #include "Tokenizer.h" 523 524 #include "DiagnosticsBase.h" 525 #include "Token.h" 526 527 #if defined(__GNUC__) 528 // Triggered by the auto-generated yy_fatal_error function. 529 #pragma GCC diagnostic ignored "-Wmissing-noreturn" 530 #endif 531 532 typedef std::string YYSTYPE; 533 typedef pp::SourceLocation YYLTYPE; 534 535 // Use the unused yycolumn variable to track file (string) number. 536 #define yyfileno yycolumn 537 538 #define YY_USER_INIT \ 539 do { \ 540 yyfileno = 0; \ 541 yylineno = 1; \ 542 yyextra->leadingSpace = false; \ 543 yyextra->lineStart = true; \ 544 } while(0); 545 546 #define YY_USER_ACTION \ 547 do \ 548 { \ 549 pp::Input* input = &yyextra->input; \ 550 pp::Input::Location* scanLoc = &yyextra->scanLoc; \ 551 while ((scanLoc->sIndex < input->count()) && \ 552 (scanLoc->cIndex >= input->length(scanLoc->sIndex))) \ 553 { \ 554 scanLoc->cIndex -= input->length(scanLoc->sIndex++); \ 555 ++yyfileno; yylineno = 1; \ 556 } \ 557 yylloc->file = yyfileno; \ 558 yylloc->line = yylineno; \ 559 scanLoc->cIndex += yyleng; \ 560 } while(0); 561 562 #define YY_INPUT(buf, result, maxSize) \ 563 result = yyextra->input.read(buf, maxSize); 564 565 #define INITIAL 0 566 #define COMMENT 1 567 568 #define YY_EXTRA_TYPE pp::Tokenizer::Context* 569 570 /* Holds the entire state of the reentrant scanner. */ 571 struct yyguts_t 572 { 573 574 /* User-defined. Not touched by flex. */ 575 YY_EXTRA_TYPE yyextra_r; 576 577 /* The rest are the same as the globals declared in the non-reentrant scanner. */ 578 FILE *yyin_r, *yyout_r; 579 size_t yy_buffer_stack_top; /**< index of top of stack. */ 580 size_t yy_buffer_stack_max; /**< capacity of stack. */ 581 YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ 582 char yy_hold_char; 583 yy_size_t yy_n_chars; 584 yy_size_t yyleng_r; 585 char *yy_c_buf_p; 586 int yy_init; 587 int yy_start; 588 int yy_did_buffer_switch_on_eof; 589 int yy_start_stack_ptr; 590 int yy_start_stack_depth; 591 int *yy_start_stack; 592 yy_state_type yy_last_accepting_state; 593 char* yy_last_accepting_cpos; 594 595 int yylineno_r; 596 int yy_flex_debug_r; 597 598 char *yytext_r; 599 int yy_more_flag; 600 int yy_more_len; 601 602 YYSTYPE * yylval_r; 603 604 YYLTYPE * yylloc_r; 605 606 }; /* end struct yyguts_t */ 607 608 static int yy_init_globals (yyscan_t yyscanner ); 609 610 /* This must go here because YYSTYPE and YYLTYPE are included 611 * from bison output in section 1.*/ 612 # define yylval yyg->yylval_r 613 614 # define yylloc yyg->yylloc_r 615 616 int pplex_init (yyscan_t* scanner); 617 618 int pplex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner); 619 620 /* Accessor methods to globals. 621 These are made visible to non-reentrant scanners for convenience. */ 622 623 int pplex_destroy (yyscan_t yyscanner ); 624 625 int ppget_debug (yyscan_t yyscanner ); 626 627 void ppset_debug (int debug_flag ,yyscan_t yyscanner ); 628 629 YY_EXTRA_TYPE ppget_extra (yyscan_t yyscanner ); 630 631 void ppset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner ); 632 633 FILE *ppget_in (yyscan_t yyscanner ); 634 635 void ppset_in (FILE * in_str ,yyscan_t yyscanner ); 636 637 FILE *ppget_out (yyscan_t yyscanner ); 638 639 void ppset_out (FILE * out_str ,yyscan_t yyscanner ); 640 641 yy_size_t ppget_leng (yyscan_t yyscanner ); 642 643 char *ppget_text (yyscan_t yyscanner ); 644 645 int ppget_lineno (yyscan_t yyscanner ); 646 647 void ppset_lineno (int line_number ,yyscan_t yyscanner ); 648 649 YYSTYPE * ppget_lval (yyscan_t yyscanner ); 650 651 void ppset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner ); 652 653 YYLTYPE *ppget_lloc (yyscan_t yyscanner ); 654 655 void ppset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner ); 656 657 /* Macros after this point can all be overridden by user definitions in 658 * section 1. 659 */ 660 661 #ifndef YY_SKIP_YYWRAP 662 #ifdef __cplusplus 663 extern "C" int ppwrap (yyscan_t yyscanner ); 664 #else 665 extern int ppwrap (yyscan_t yyscanner ); 666 #endif 667 #endif 668 669 #ifndef yytext_ptr 670 static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner); 671 #endif 672 673 #ifdef YY_NEED_STRLEN 674 static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner); 675 #endif 676 677 #ifndef YY_NO_INPUT 678 679 #ifdef __cplusplus 680 static int yyinput (yyscan_t yyscanner ); 681 #else 682 static int input (yyscan_t yyscanner ); 683 #endif 684 685 #endif 686 687 /* Amount of stuff to slurp up with each read. */ 688 #ifndef YY_READ_BUF_SIZE 689 #define YY_READ_BUF_SIZE 8192 690 #endif 691 692 /* Copy whatever the last rule matched to the standard output. */ 693 #ifndef ECHO 694 /* This used to be an fputs(), but since the string might contain NUL's, 695 * we now use fwrite(). 696 */ 697 #define ECHO fwrite( yytext, yyleng, 1, yyout ) 698 #endif 699 700 /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, 701 * is returned in "result". 702 */ 703 #ifndef YY_INPUT 704 #define YY_INPUT(buf,result,max_size) \ 705 if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ 706 { \ 707 int c = '*'; \ 708 yy_size_t n; \ 709 for ( n = 0; n < max_size && \ 710 (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ 711 buf[n] = (char) c; \ 712 if ( c == '\n' ) \ 713 buf[n++] = (char) c; \ 714 if ( c == EOF && ferror( yyin ) ) \ 715 YY_FATAL_ERROR( "input in flex scanner failed" ); \ 716 result = n; \ 717 } \ 718 else \ 719 { \ 720 errno=0; \ 721 while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ 722 { \ 723 if( errno != EINTR) \ 724 { \ 725 YY_FATAL_ERROR( "input in flex scanner failed" ); \ 726 break; \ 727 } \ 728 errno=0; \ 729 clearerr(yyin); \ 730 } \ 731 }\ 732 \ 733 734 #endif 735 736 /* No semi-colon after return; correct usage is to write "yyterminate();" - 737 * we don't want an extra ';' after the "return" because that will cause 738 * some compilers to complain about unreachable statements. 739 */ 740 #ifndef yyterminate 741 #define yyterminate() return YY_NULL 742 #endif 743 744 /* Number of entries by which start-condition stack grows. */ 745 #ifndef YY_START_STACK_INCR 746 #define YY_START_STACK_INCR 25 747 #endif 748 749 /* Report a fatal error. */ 750 #ifndef YY_FATAL_ERROR 751 #define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) 752 #endif 753 754 /* end tables serialization structures and prototypes */ 755 756 /* Default declaration of generated scanner - a define so the user can 757 * easily add parameters. 758 */ 759 #ifndef YY_DECL 760 #define YY_DECL_IS_OURS 1 761 762 extern int pplex \ 763 (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner); 764 765 #define YY_DECL int pplex \ 766 (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner) 767 #endif /* !YY_DECL */ 768 769 /* Code executed at the beginning of each rule, after yytext and yyleng 770 * have been set up. 771 */ 772 #ifndef YY_USER_ACTION 773 #define YY_USER_ACTION 774 #endif 775 776 /* Code executed at the end of each rule. */ 777 #ifndef YY_BREAK 778 #define YY_BREAK break; 779 #endif 780 781 #define YY_RULE_SETUP \ 782 YY_USER_ACTION 783 784 /** The main scanner function which does all the work. 785 */ 786 YY_DECL 787 { 788 register yy_state_type yy_current_state; 789 register char *yy_cp, *yy_bp; 790 register int yy_act; 791 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 792 793 /* Line comment */ 794 795 yylval = yylval_param; 796 797 yylloc = yylloc_param; 798 799 if ( !yyg->yy_init ) 800 { 801 yyg->yy_init = 1; 802 803 #ifdef YY_USER_INIT 804 YY_USER_INIT; 805 #endif 806 807 if ( ! yyg->yy_start ) 808 yyg->yy_start = 1; /* first start state */ 809 810 if ( ! yyin ) 811 yyin = stdin; 812 813 if ( ! yyout ) 814 yyout = stdout; 815 816 if ( ! YY_CURRENT_BUFFER ) { 817 ppensure_buffer_stack (yyscanner); 818 YY_CURRENT_BUFFER_LVALUE = 819 pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); 820 } 821 822 pp_load_buffer_state(yyscanner ); 823 } 824 825 while ( 1 ) /* loops until end-of-file is reached */ 826 { 827 yy_cp = yyg->yy_c_buf_p; 828 829 /* Support of yytext. */ 830 *yy_cp = yyg->yy_hold_char; 831 832 /* yy_bp points to the position in yy_ch_buf of the start of 833 * the current run. 834 */ 835 yy_bp = yy_cp; 836 837 yy_current_state = yyg->yy_start; 838 yy_match: 839 do 840 { 841 register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; 842 if ( yy_accept[yy_current_state] ) 843 { 844 yyg->yy_last_accepting_state = yy_current_state; 845 yyg->yy_last_accepting_cpos = yy_cp; 846 } 847 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) 848 { 849 yy_current_state = (int) yy_def[yy_current_state]; 850 if ( yy_current_state >= 87 ) 851 yy_c = yy_meta[(unsigned int) yy_c]; 852 } 853 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; 854 ++yy_cp; 855 } 856 while ( yy_current_state != 86 ); 857 yy_cp = yyg->yy_last_accepting_cpos; 858 yy_current_state = yyg->yy_last_accepting_state; 859 860 yy_find_action: 861 yy_act = yy_accept[yy_current_state]; 862 863 YY_DO_BEFORE_ACTION; 864 865 do_action: /* This label is used only to access EOF actions. */ 866 867 switch ( yy_act ) 868 { /* beginning of action switch */ 869 case 0: /* must back up */ 870 /* undo the effects of YY_DO_BEFORE_ACTION */ 871 *yy_cp = yyg->yy_hold_char; 872 yy_cp = yyg->yy_last_accepting_cpos; 873 yy_current_state = yyg->yy_last_accepting_state; 874 goto yy_find_action; 875 876 case 1: 877 YY_RULE_SETUP 878 879 YY_BREAK 880 /* Block comment */ 881 /* Line breaks are just counted - not returned. */ 882 /* The comment is replaced by a single space. */ 883 case 2: 884 YY_RULE_SETUP 885 { BEGIN(COMMENT); } 886 YY_BREAK 887 case 3: 888 YY_RULE_SETUP 889 890 YY_BREAK 891 case 4: 892 YY_RULE_SETUP 893 894 YY_BREAK 895 case 5: 896 /* rule 5 can match eol */ 897 YY_RULE_SETUP 898 { ++yylineno; } 899 YY_BREAK 900 case 6: 901 YY_RULE_SETUP 902 { 903 yyextra->leadingSpace = true; 904 BEGIN(INITIAL); 905 } 906 YY_BREAK 907 case 7: 908 YY_RULE_SETUP 909 { 910 // # is only valid at start of line for preprocessor directives. 911 yylval->assign(1, yytext[0]); 912 return yyextra->lineStart ? pp::Token::PP_HASH : pp::Token::PP_OTHER; 913 } 914 YY_BREAK 915 case 8: 916 YY_RULE_SETUP 917 { 918 yylval->assign(yytext, yyleng); 919 return pp::Token::IDENTIFIER; 920 } 921 YY_BREAK 922 case 9: 923 YY_RULE_SETUP 924 { 925 yylval->assign(yytext, yyleng); 926 return pp::Token::CONST_INT; 927 } 928 YY_BREAK 929 case 10: 930 YY_RULE_SETUP 931 { 932 yylval->assign(yytext, yyleng); 933 return pp::Token::CONST_FLOAT; 934 } 935 YY_BREAK 936 /* Anything that starts with a {DIGIT} or .{DIGIT} must be a number. */ 937 /* Rule to catch all invalid integers and floats. */ 938 case 11: 939 YY_RULE_SETUP 940 { 941 yylval->assign(yytext, yyleng); 942 return pp::Token::PP_NUMBER; 943 } 944 YY_BREAK 945 case 12: 946 YY_RULE_SETUP 947 { 948 yylval->assign(yytext, yyleng); 949 return pp::Token::OP_INC; 950 } 951 YY_BREAK 952 case 13: 953 YY_RULE_SETUP 954 { 955 yylval->assign(yytext, yyleng); 956 return pp::Token::OP_DEC; 957 } 958 YY_BREAK 959 case 14: 960 YY_RULE_SETUP 961 { 962 yylval->assign(yytext, yyleng); 963 return pp::Token::OP_LEFT; 964 } 965 YY_BREAK 966 case 15: 967 YY_RULE_SETUP 968 { 969 yylval->assign(yytext, yyleng); 970 return pp::Token::OP_RIGHT; 971 } 972 YY_BREAK 973 case 16: 974 YY_RULE_SETUP 975 { 976 yylval->assign(yytext, yyleng); 977 return pp::Token::OP_LE; 978 } 979 YY_BREAK 980 case 17: 981 YY_RULE_SETUP 982 { 983 yylval->assign(yytext, yyleng); 984 return pp::Token::OP_GE; 985 } 986 YY_BREAK 987 case 18: 988 YY_RULE_SETUP 989 { 990 yylval->assign(yytext, yyleng); 991 return pp::Token::OP_EQ; 992 } 993 YY_BREAK 994 case 19: 995 YY_RULE_SETUP 996 { 997 yylval->assign(yytext, yyleng); 998 return pp::Token::OP_NE; 999 } 1000 YY_BREAK 1001 case 20: 1002 YY_RULE_SETUP 1003 { 1004 yylval->assign(yytext, yyleng); 1005 return pp::Token::OP_AND; 1006 } 1007 YY_BREAK 1008 case 21: 1009 YY_RULE_SETUP 1010 { 1011 yylval->assign(yytext, yyleng); 1012 return pp::Token::OP_XOR; 1013 } 1014 YY_BREAK 1015 case 22: 1016 YY_RULE_SETUP 1017 { 1018 yylval->assign(yytext, yyleng); 1019 return pp::Token::OP_OR; 1020 } 1021 YY_BREAK 1022 case 23: 1023 YY_RULE_SETUP 1024 { 1025 yylval->assign(yytext, yyleng); 1026 return pp::Token::OP_ADD_ASSIGN; 1027 } 1028 YY_BREAK 1029 case 24: 1030 YY_RULE_SETUP 1031 { 1032 yylval->assign(yytext, yyleng); 1033 return pp::Token::OP_SUB_ASSIGN; 1034 } 1035 YY_BREAK 1036 case 25: 1037 YY_RULE_SETUP 1038 { 1039 yylval->assign(yytext, yyleng); 1040 return pp::Token::OP_MUL_ASSIGN; 1041 } 1042 YY_BREAK 1043 case 26: 1044 YY_RULE_SETUP 1045 { 1046 yylval->assign(yytext, yyleng); 1047 return pp::Token::OP_DIV_ASSIGN; 1048 } 1049 YY_BREAK 1050 case 27: 1051 YY_RULE_SETUP 1052 { 1053 yylval->assign(yytext, yyleng); 1054 return pp::Token::OP_MOD_ASSIGN; 1055 } 1056 YY_BREAK 1057 case 28: 1058 YY_RULE_SETUP 1059 { 1060 yylval->assign(yytext, yyleng); 1061 return pp::Token::OP_LEFT_ASSIGN; 1062 } 1063 YY_BREAK 1064 case 29: 1065 YY_RULE_SETUP 1066 { 1067 yylval->assign(yytext, yyleng); 1068 return pp::Token::OP_RIGHT_ASSIGN; 1069 } 1070 YY_BREAK 1071 case 30: 1072 YY_RULE_SETUP 1073 { 1074 yylval->assign(yytext, yyleng); 1075 return pp::Token::OP_AND_ASSIGN; 1076 } 1077 YY_BREAK 1078 case 31: 1079 YY_RULE_SETUP 1080 { 1081 yylval->assign(yytext, yyleng); 1082 return pp::Token::OP_XOR_ASSIGN; 1083 } 1084 YY_BREAK 1085 case 32: 1086 YY_RULE_SETUP 1087 { 1088 yylval->assign(yytext, yyleng); 1089 return pp::Token::OP_OR_ASSIGN; 1090 } 1091 YY_BREAK 1092 case 33: 1093 YY_RULE_SETUP 1094 { 1095 yylval->assign(1, yytext[0]); 1096 return yytext[0]; 1097 } 1098 YY_BREAK 1099 case 34: 1100 YY_RULE_SETUP 1101 { yyextra->leadingSpace = true; } 1102 YY_BREAK 1103 case 35: 1104 /* rule 35 can match eol */ 1105 YY_RULE_SETUP 1106 { 1107 ++yylineno; 1108 yylval->assign(1, '\n'); 1109 return '\n'; 1110 } 1111 YY_BREAK 1112 case 36: 1113 /* rule 36 can match eol */ 1114 YY_RULE_SETUP 1115 { ++yylineno; } 1116 YY_BREAK 1117 case 37: 1118 YY_RULE_SETUP 1119 { 1120 yylval->assign(1, yytext[0]); 1121 return pp::Token::PP_OTHER; 1122 } 1123 YY_BREAK 1124 case YY_STATE_EOF(INITIAL): 1125 case YY_STATE_EOF(COMMENT): 1126 { 1127 // YY_USER_ACTION is not invoked for handling EOF. 1128 // Set the location for EOF token manually. 1129 pp::Input* input = &yyextra->input; 1130 pp::Input::Location* scanLoc = &yyextra->scanLoc; 1131 yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0; 1132 if (scanLoc->sIndex != sIndexMax) 1133 { 1134 // We can only reach here if there are empty strings at the 1135 // end of the input. 1136 scanLoc->sIndex = sIndexMax; scanLoc->cIndex = 0; 1137 // FIXME: this is not 64-bit clean. 1138 yyfileno = static_cast<int>(sIndexMax); yylineno = 1; 1139 } 1140 yylloc->file = yyfileno; 1141 yylloc->line = yylineno; 1142 yylval->clear(); 1143 1144 if (YY_START == COMMENT) 1145 { 1146 yyextra->diagnostics->report(pp::Diagnostics::EOF_IN_COMMENT, 1147 pp::SourceLocation(yyfileno, yylineno), 1148 ""); 1149 } 1150 yyterminate(); 1151 } 1152 YY_BREAK 1153 case 38: 1154 YY_RULE_SETUP 1155 ECHO; 1156 YY_BREAK 1157 1158 case YY_END_OF_BUFFER: 1159 { 1160 /* Amount of text matched not including the EOB char. */ 1161 int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1; 1162 1163 /* Undo the effects of YY_DO_BEFORE_ACTION. */ 1164 *yy_cp = yyg->yy_hold_char; 1165 YY_RESTORE_YY_MORE_OFFSET 1166 1167 if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) 1168 { 1169 /* We're scanning a new file or input source. It's 1170 * possible that this happened because the user 1171 * just pointed yyin at a new source and called 1172 * pplex(). If so, then we have to assure 1173 * consistency between YY_CURRENT_BUFFER and our 1174 * globals. Here is the right place to do so, because 1175 * this is the first action (other than possibly a 1176 * back-up) that will match for the new input source. 1177 */ 1178 yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; 1179 YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; 1180 YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; 1181 } 1182 1183 /* Note that here we test for yy_c_buf_p "<=" to the position 1184 * of the first EOB in the buffer, since yy_c_buf_p will 1185 * already have been incremented past the NUL character 1186 * (since all states make transitions on EOB to the 1187 * end-of-buffer state). Contrast this with the test 1188 * in input(). 1189 */ 1190 if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) 1191 { /* This was really a NUL. */ 1192 yy_state_type yy_next_state; 1193 1194 yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text; 1195 1196 yy_current_state = yy_get_previous_state( yyscanner ); 1197 1198 /* Okay, we're now positioned to make the NUL 1199 * transition. We couldn't have 1200 * yy_get_previous_state() go ahead and do it 1201 * for us because it doesn't know how to deal 1202 * with the possibility of jamming (and we don't 1203 * want to build jamming into it because then it 1204 * will run more slowly). 1205 */ 1206 1207 yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner); 1208 1209 yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; 1210 1211 if ( yy_next_state ) 1212 { 1213 /* Consume the NUL. */ 1214 yy_cp = ++yyg->yy_c_buf_p; 1215 yy_current_state = yy_next_state; 1216 goto yy_match; 1217 } 1218 1219 else 1220 { 1221 yy_cp = yyg->yy_last_accepting_cpos; 1222 yy_current_state = yyg->yy_last_accepting_state; 1223 goto yy_find_action; 1224 } 1225 } 1226 1227 else switch ( yy_get_next_buffer( yyscanner ) ) 1228 { 1229 case EOB_ACT_END_OF_FILE: 1230 { 1231 yyg->yy_did_buffer_switch_on_eof = 0; 1232 1233 if ( ppwrap(yyscanner ) ) 1234 { 1235 /* Note: because we've taken care in 1236 * yy_get_next_buffer() to have set up 1237 * yytext, we can now set up 1238 * yy_c_buf_p so that if some total 1239 * hoser (like flex itself) wants to 1240 * call the scanner after we return the 1241 * YY_NULL, it'll still work - another 1242 * YY_NULL will get returned. 1243 */ 1244 yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ; 1245 1246 yy_act = YY_STATE_EOF(YY_START); 1247 goto do_action; 1248 } 1249 1250 else 1251 { 1252 if ( ! yyg->yy_did_buffer_switch_on_eof ) 1253 YY_NEW_FILE; 1254 } 1255 break; 1256 } 1257 1258 case EOB_ACT_CONTINUE_SCAN: 1259 yyg->yy_c_buf_p = 1260 yyg->yytext_ptr + yy_amount_of_matched_text; 1261 1262 yy_current_state = yy_get_previous_state( yyscanner ); 1263 1264 yy_cp = yyg->yy_c_buf_p; 1265 yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; 1266 goto yy_match; 1267 1268 case EOB_ACT_LAST_MATCH: 1269 yyg->yy_c_buf_p = 1270 &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars]; 1271 1272 yy_current_state = yy_get_previous_state( yyscanner ); 1273 1274 yy_cp = yyg->yy_c_buf_p; 1275 yy_bp = yyg->yytext_ptr + YY_MORE_ADJ; 1276 goto yy_find_action; 1277 } 1278 break; 1279 } 1280 1281 default: 1282 YY_FATAL_ERROR( 1283 "fatal flex scanner internal error--no action found" ); 1284 } /* end of action switch */ 1285 } /* end of scanning one token */ 1286 } /* end of pplex */ 1287 1288 /* yy_get_next_buffer - try to read in a new buffer 1289 * 1290 * Returns a code representing an action: 1291 * EOB_ACT_LAST_MATCH - 1292 * EOB_ACT_CONTINUE_SCAN - continue scanning from current position 1293 * EOB_ACT_END_OF_FILE - end of file 1294 */ 1295 static int yy_get_next_buffer (yyscan_t yyscanner) 1296 { 1297 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1298 register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; 1299 register char *source = yyg->yytext_ptr; 1300 register int number_to_move, i; 1301 int ret_val; 1302 1303 if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] ) 1304 YY_FATAL_ERROR( 1305 "fatal flex scanner internal error--end of buffer missed" ); 1306 1307 if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) 1308 { /* Don't try to fill the buffer, so this is an EOF. */ 1309 if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 ) 1310 { 1311 /* We matched a single character, the EOB, so 1312 * treat this as a final EOF. 1313 */ 1314 return EOB_ACT_END_OF_FILE; 1315 } 1316 1317 else 1318 { 1319 /* We matched some text prior to the EOB, first 1320 * process it. 1321 */ 1322 return EOB_ACT_LAST_MATCH; 1323 } 1324 } 1325 1326 /* Try to read more data. */ 1327 1328 /* First move last chars to start of buffer. */ 1329 number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1; 1330 1331 for ( i = 0; i < number_to_move; ++i ) 1332 *(dest++) = *(source++); 1333 1334 if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) 1335 /* don't do the read, it's not guaranteed to return an EOF, 1336 * just force an EOF 1337 */ 1338 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0; 1339 1340 else 1341 { 1342 yy_size_t num_to_read = 1343 YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; 1344 1345 while ( num_to_read <= 0 ) 1346 { /* Not enough room in the buffer - grow it. */ 1347 1348 /* just a shorter name for the current buffer */ 1349 YY_BUFFER_STATE b = YY_CURRENT_BUFFER; 1350 1351 int yy_c_buf_p_offset = 1352 (int) (yyg->yy_c_buf_p - b->yy_ch_buf); 1353 1354 if ( b->yy_is_our_buffer ) 1355 { 1356 yy_size_t new_size = b->yy_buf_size * 2; 1357 1358 if ( new_size <= 0 ) 1359 b->yy_buf_size += b->yy_buf_size / 8; 1360 else 1361 b->yy_buf_size *= 2; 1362 1363 b->yy_ch_buf = (char *) 1364 /* Include room in for 2 EOB chars. */ 1365 pprealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner ); 1366 } 1367 else 1368 /* Can't grow it, we don't own it. */ 1369 b->yy_ch_buf = 0; 1370 1371 if ( ! b->yy_ch_buf ) 1372 YY_FATAL_ERROR( 1373 "fatal error - scanner input buffer overflow" ); 1374 1375 yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; 1376 1377 num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - 1378 number_to_move - 1; 1379 1380 } 1381 1382 if ( num_to_read > YY_READ_BUF_SIZE ) 1383 num_to_read = YY_READ_BUF_SIZE; 1384 1385 /* Read in more data. */ 1386 YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), 1387 yyg->yy_n_chars, num_to_read ); 1388 1389 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; 1390 } 1391 1392 if ( yyg->yy_n_chars == 0 ) 1393 { 1394 if ( number_to_move == YY_MORE_ADJ ) 1395 { 1396 ret_val = EOB_ACT_END_OF_FILE; 1397 pprestart(yyin ,yyscanner); 1398 } 1399 1400 else 1401 { 1402 ret_val = EOB_ACT_LAST_MATCH; 1403 YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = 1404 YY_BUFFER_EOF_PENDING; 1405 } 1406 } 1407 1408 else 1409 ret_val = EOB_ACT_CONTINUE_SCAN; 1410 1411 if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { 1412 /* Extend the array by 50%, plus the number we really need. */ 1413 yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1); 1414 YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) pprealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner ); 1415 if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) 1416 YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); 1417 } 1418 1419 yyg->yy_n_chars += number_to_move; 1420 YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR; 1421 YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; 1422 1423 yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; 1424 1425 return ret_val; 1426 } 1427 1428 /* yy_get_previous_state - get the state just before the EOB char was reached */ 1429 1430 static yy_state_type yy_get_previous_state (yyscan_t yyscanner) 1431 { 1432 register yy_state_type yy_current_state; 1433 register char *yy_cp; 1434 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1435 1436 yy_current_state = yyg->yy_start; 1437 1438 for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp ) 1439 { 1440 register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); 1441 if ( yy_accept[yy_current_state] ) 1442 { 1443 yyg->yy_last_accepting_state = yy_current_state; 1444 yyg->yy_last_accepting_cpos = yy_cp; 1445 } 1446 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) 1447 { 1448 yy_current_state = (int) yy_def[yy_current_state]; 1449 if ( yy_current_state >= 87 ) 1450 yy_c = yy_meta[(unsigned int) yy_c]; 1451 } 1452 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; 1453 } 1454 1455 return yy_current_state; 1456 } 1457 1458 /* yy_try_NUL_trans - try to make a transition on the NUL character 1459 * 1460 * synopsis 1461 * next_state = yy_try_NUL_trans( current_state ); 1462 */ 1463 static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner) 1464 { 1465 register int yy_is_jam; 1466 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */ 1467 register char *yy_cp = yyg->yy_c_buf_p; 1468 1469 register YY_CHAR yy_c = 1; 1470 if ( yy_accept[yy_current_state] ) 1471 { 1472 yyg->yy_last_accepting_state = yy_current_state; 1473 yyg->yy_last_accepting_cpos = yy_cp; 1474 } 1475 while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) 1476 { 1477 yy_current_state = (int) yy_def[yy_current_state]; 1478 if ( yy_current_state >= 87 ) 1479 yy_c = yy_meta[(unsigned int) yy_c]; 1480 } 1481 yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; 1482 yy_is_jam = (yy_current_state == 86); 1483 1484 return yy_is_jam ? 0 : yy_current_state; 1485 } 1486 1487 #ifndef YY_NO_INPUT 1488 #ifdef __cplusplus 1489 static int yyinput (yyscan_t yyscanner) 1490 #else 1491 static int input (yyscan_t yyscanner) 1492 #endif 1493 1494 { 1495 int c; 1496 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1497 1498 *yyg->yy_c_buf_p = yyg->yy_hold_char; 1499 1500 if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) 1501 { 1502 /* yy_c_buf_p now points to the character we want to return. 1503 * If this occurs *before* the EOB characters, then it's a 1504 * valid NUL; if not, then we've hit the end of the buffer. 1505 */ 1506 if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] ) 1507 /* This was really a NUL. */ 1508 *yyg->yy_c_buf_p = '\0'; 1509 1510 else 1511 { /* need more input */ 1512 yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr; 1513 ++yyg->yy_c_buf_p; 1514 1515 switch ( yy_get_next_buffer( yyscanner ) ) 1516 { 1517 case EOB_ACT_LAST_MATCH: 1518 /* This happens because yy_g_n_b() 1519 * sees that we've accumulated a 1520 * token and flags that we need to 1521 * try matching the token before 1522 * proceeding. But for input(), 1523 * there's no matching to consider. 1524 * So convert the EOB_ACT_LAST_MATCH 1525 * to EOB_ACT_END_OF_FILE. 1526 */ 1527 1528 /* Reset buffer status. */ 1529 pprestart(yyin ,yyscanner); 1530 1531 /*FALLTHROUGH*/ 1532 1533 case EOB_ACT_END_OF_FILE: 1534 { 1535 if ( ppwrap(yyscanner ) ) 1536 return EOF; 1537 1538 if ( ! yyg->yy_did_buffer_switch_on_eof ) 1539 YY_NEW_FILE; 1540 #ifdef __cplusplus 1541 return yyinput(yyscanner); 1542 #else 1543 return input(yyscanner); 1544 #endif 1545 } 1546 1547 case EOB_ACT_CONTINUE_SCAN: 1548 yyg->yy_c_buf_p = yyg->yytext_ptr + offset; 1549 break; 1550 } 1551 } 1552 } 1553 1554 c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */ 1555 *yyg->yy_c_buf_p = '\0'; /* preserve yytext */ 1556 yyg->yy_hold_char = *++yyg->yy_c_buf_p; 1557 1558 return c; 1559 } 1560 #endif /* ifndef YY_NO_INPUT */ 1561 1562 /** Immediately switch to a different input stream. 1563 * @param input_file A readable stream. 1564 * @param yyscanner The scanner object. 1565 * @note This function does not reset the start condition to @c INITIAL . 1566 */ 1567 void pprestart (FILE * input_file , yyscan_t yyscanner) 1568 { 1569 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1570 1571 if ( ! YY_CURRENT_BUFFER ){ 1572 ppensure_buffer_stack (yyscanner); 1573 YY_CURRENT_BUFFER_LVALUE = 1574 pp_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); 1575 } 1576 1577 pp_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner); 1578 pp_load_buffer_state(yyscanner ); 1579 } 1580 1581 /** Switch to a different input buffer. 1582 * @param new_buffer The new input buffer. 1583 * @param yyscanner The scanner object. 1584 */ 1585 void pp_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) 1586 { 1587 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1588 1589 /* TODO. We should be able to replace this entire function body 1590 * with 1591 * pppop_buffer_state(); 1592 * pppush_buffer_state(new_buffer); 1593 */ 1594 ppensure_buffer_stack (yyscanner); 1595 if ( YY_CURRENT_BUFFER == new_buffer ) 1596 return; 1597 1598 if ( YY_CURRENT_BUFFER ) 1599 { 1600 /* Flush out information for old buffer. */ 1601 *yyg->yy_c_buf_p = yyg->yy_hold_char; 1602 YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; 1603 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; 1604 } 1605 1606 YY_CURRENT_BUFFER_LVALUE = new_buffer; 1607 pp_load_buffer_state(yyscanner ); 1608 1609 /* We don't actually know whether we did this switch during 1610 * EOF (ppwrap()) processing, but the only time this flag 1611 * is looked at is after ppwrap() is called, so it's safe 1612 * to go ahead and always set it. 1613 */ 1614 yyg->yy_did_buffer_switch_on_eof = 1; 1615 } 1616 1617 static void pp_load_buffer_state (yyscan_t yyscanner) 1618 { 1619 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1620 yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; 1621 yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; 1622 yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; 1623 yyg->yy_hold_char = *yyg->yy_c_buf_p; 1624 } 1625 1626 /** Allocate and initialize an input buffer state. 1627 * @param file A readable stream. 1628 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. 1629 * @param yyscanner The scanner object. 1630 * @return the allocated buffer state. 1631 */ 1632 YY_BUFFER_STATE pp_create_buffer (FILE * file, int size , yyscan_t yyscanner) 1633 { 1634 YY_BUFFER_STATE b; 1635 1636 b = (YY_BUFFER_STATE) ppalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); 1637 if ( ! b ) 1638 YY_FATAL_ERROR( "out of dynamic memory in pp_create_buffer()" ); 1639 1640 b->yy_buf_size = size; 1641 1642 /* yy_ch_buf has to be 2 characters longer than the size given because 1643 * we need to put in 2 end-of-buffer characters. 1644 */ 1645 b->yy_ch_buf = (char *) ppalloc(b->yy_buf_size + 2 ,yyscanner ); 1646 if ( ! b->yy_ch_buf ) 1647 YY_FATAL_ERROR( "out of dynamic memory in pp_create_buffer()" ); 1648 1649 b->yy_is_our_buffer = 1; 1650 1651 pp_init_buffer(b,file ,yyscanner); 1652 1653 return b; 1654 } 1655 1656 /** Destroy the buffer. 1657 * @param b a buffer created with pp_create_buffer() 1658 * @param yyscanner The scanner object. 1659 */ 1660 void pp_delete_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) 1661 { 1662 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1663 1664 if ( ! b ) 1665 return; 1666 1667 if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ 1668 YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; 1669 1670 if ( b->yy_is_our_buffer ) 1671 ppfree((void *) b->yy_ch_buf ,yyscanner ); 1672 1673 ppfree((void *) b ,yyscanner ); 1674 } 1675 1676 /* Initializes or reinitializes a buffer. 1677 * This function is sometimes called more than once on the same buffer, 1678 * such as during a pprestart() or at EOF. 1679 */ 1680 static void pp_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner) 1681 1682 { 1683 int oerrno = errno; 1684 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1685 1686 pp_flush_buffer(b ,yyscanner); 1687 1688 b->yy_input_file = file; 1689 b->yy_fill_buffer = 1; 1690 1691 /* If b is the current buffer, then pp_init_buffer was _probably_ 1692 * called from pprestart() or through yy_get_next_buffer. 1693 * In that case, we don't want to reset the lineno or column. 1694 */ 1695 if (b != YY_CURRENT_BUFFER){ 1696 b->yy_bs_lineno = 1; 1697 b->yy_bs_column = 0; 1698 } 1699 1700 b->yy_is_interactive = 0; 1701 1702 errno = oerrno; 1703 } 1704 1705 /** Discard all buffered characters. On the next scan, YY_INPUT will be called. 1706 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. 1707 * @param yyscanner The scanner object. 1708 */ 1709 void pp_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner) 1710 { 1711 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1712 if ( ! b ) 1713 return; 1714 1715 b->yy_n_chars = 0; 1716 1717 /* We always need two end-of-buffer characters. The first causes 1718 * a transition to the end-of-buffer state. The second causes 1719 * a jam in that state. 1720 */ 1721 b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; 1722 b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; 1723 1724 b->yy_buf_pos = &b->yy_ch_buf[0]; 1725 1726 b->yy_at_bol = 1; 1727 b->yy_buffer_status = YY_BUFFER_NEW; 1728 1729 if ( b == YY_CURRENT_BUFFER ) 1730 pp_load_buffer_state(yyscanner ); 1731 } 1732 1733 /** Pushes the new state onto the stack. The new state becomes 1734 * the current state. This function will allocate the stack 1735 * if necessary. 1736 * @param new_buffer The new state. 1737 * @param yyscanner The scanner object. 1738 */ 1739 void pppush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner) 1740 { 1741 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1742 if (new_buffer == NULL) 1743 return; 1744 1745 ppensure_buffer_stack(yyscanner); 1746 1747 /* This block is copied from pp_switch_to_buffer. */ 1748 if ( YY_CURRENT_BUFFER ) 1749 { 1750 /* Flush out information for old buffer. */ 1751 *yyg->yy_c_buf_p = yyg->yy_hold_char; 1752 YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p; 1753 YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars; 1754 } 1755 1756 /* Only push if top exists. Otherwise, replace top. */ 1757 if (YY_CURRENT_BUFFER) 1758 yyg->yy_buffer_stack_top++; 1759 YY_CURRENT_BUFFER_LVALUE = new_buffer; 1760 1761 /* copied from pp_switch_to_buffer. */ 1762 pp_load_buffer_state(yyscanner ); 1763 yyg->yy_did_buffer_switch_on_eof = 1; 1764 } 1765 1766 /** Removes and deletes the top of the stack, if present. 1767 * The next element becomes the new top. 1768 * @param yyscanner The scanner object. 1769 */ 1770 void pppop_buffer_state (yyscan_t yyscanner) 1771 { 1772 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1773 if (!YY_CURRENT_BUFFER) 1774 return; 1775 1776 pp_delete_buffer(YY_CURRENT_BUFFER ,yyscanner); 1777 YY_CURRENT_BUFFER_LVALUE = NULL; 1778 if (yyg->yy_buffer_stack_top > 0) 1779 --yyg->yy_buffer_stack_top; 1780 1781 if (YY_CURRENT_BUFFER) { 1782 pp_load_buffer_state(yyscanner ); 1783 yyg->yy_did_buffer_switch_on_eof = 1; 1784 } 1785 } 1786 1787 /* Allocates the stack if it does not exist. 1788 * Guarantees space for at least one push. 1789 */ 1790 static void ppensure_buffer_stack (yyscan_t yyscanner) 1791 { 1792 yy_size_t num_to_alloc; 1793 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1794 1795 if (!yyg->yy_buffer_stack) { 1796 1797 /* First allocation is just for 2 elements, since we don't know if this 1798 * scanner will even need a stack. We use 2 instead of 1 to avoid an 1799 * immediate realloc on the next call. 1800 */ 1801 num_to_alloc = 1; 1802 yyg->yy_buffer_stack = (struct yy_buffer_state**)ppalloc 1803 (num_to_alloc * sizeof(struct yy_buffer_state*) 1804 , yyscanner); 1805 if ( ! yyg->yy_buffer_stack ) 1806 YY_FATAL_ERROR( "out of dynamic memory in ppensure_buffer_stack()" ); 1807 1808 memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*)); 1809 1810 yyg->yy_buffer_stack_max = num_to_alloc; 1811 yyg->yy_buffer_stack_top = 0; 1812 return; 1813 } 1814 1815 if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){ 1816 1817 /* Increase the buffer to prepare for a possible push. */ 1818 int grow_size = 8 /* arbitrary grow size */; 1819 1820 num_to_alloc = yyg->yy_buffer_stack_max + grow_size; 1821 yyg->yy_buffer_stack = (struct yy_buffer_state**)pprealloc 1822 (yyg->yy_buffer_stack, 1823 num_to_alloc * sizeof(struct yy_buffer_state*) 1824 , yyscanner); 1825 if ( ! yyg->yy_buffer_stack ) 1826 YY_FATAL_ERROR( "out of dynamic memory in ppensure_buffer_stack()" ); 1827 1828 /* zero only the new slots.*/ 1829 memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*)); 1830 yyg->yy_buffer_stack_max = num_to_alloc; 1831 } 1832 } 1833 1834 /** Setup the input buffer state to scan directly from a user-specified character buffer. 1835 * @param base the character buffer 1836 * @param size the size in bytes of the character buffer 1837 * @param yyscanner The scanner object. 1838 * @return the newly allocated buffer state object. 1839 */ 1840 YY_BUFFER_STATE pp_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner) 1841 { 1842 YY_BUFFER_STATE b; 1843 1844 if ( size < 2 || 1845 base[size-2] != YY_END_OF_BUFFER_CHAR || 1846 base[size-1] != YY_END_OF_BUFFER_CHAR ) 1847 /* They forgot to leave room for the EOB's. */ 1848 return 0; 1849 1850 b = (YY_BUFFER_STATE) ppalloc(sizeof( struct yy_buffer_state ) ,yyscanner ); 1851 if ( ! b ) 1852 YY_FATAL_ERROR( "out of dynamic memory in pp_scan_buffer()" ); 1853 1854 b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ 1855 b->yy_buf_pos = b->yy_ch_buf = base; 1856 b->yy_is_our_buffer = 0; 1857 b->yy_input_file = 0; 1858 b->yy_n_chars = b->yy_buf_size; 1859 b->yy_is_interactive = 0; 1860 b->yy_at_bol = 1; 1861 b->yy_fill_buffer = 0; 1862 b->yy_buffer_status = YY_BUFFER_NEW; 1863 1864 pp_switch_to_buffer(b ,yyscanner ); 1865 1866 return b; 1867 } 1868 1869 /** Setup the input buffer state to scan a string. The next call to pplex() will 1870 * scan from a @e copy of @a str. 1871 * @param yystr a NUL-terminated string to scan 1872 * @param yyscanner The scanner object. 1873 * @return the newly allocated buffer state object. 1874 * @note If you want to scan bytes that may contain NUL values, then use 1875 * pp_scan_bytes() instead. 1876 */ 1877 YY_BUFFER_STATE pp_scan_string (yyconst char * yystr , yyscan_t yyscanner) 1878 { 1879 1880 return pp_scan_bytes(yystr,strlen(yystr) ,yyscanner); 1881 } 1882 1883 /** Setup the input buffer state to scan the given bytes. The next call to pplex() will 1884 * scan from a @e copy of @a bytes. 1885 * @param bytes the byte buffer to scan 1886 * @param len the number of bytes in the buffer pointed to by @a bytes. 1887 * @param yyscanner The scanner object. 1888 * @return the newly allocated buffer state object. 1889 */ 1890 YY_BUFFER_STATE pp_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len , yyscan_t yyscanner) 1891 { 1892 YY_BUFFER_STATE b; 1893 char *buf; 1894 yy_size_t n, i; 1895 1896 /* Get memory for full buffer, including space for trailing EOB's. */ 1897 n = _yybytes_len + 2; 1898 buf = (char *) ppalloc(n ,yyscanner ); 1899 if ( ! buf ) 1900 YY_FATAL_ERROR( "out of dynamic memory in pp_scan_bytes()" ); 1901 1902 for ( i = 0; i < _yybytes_len; ++i ) 1903 buf[i] = yybytes[i]; 1904 1905 buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; 1906 1907 b = pp_scan_buffer(buf,n ,yyscanner); 1908 if ( ! b ) 1909 YY_FATAL_ERROR( "bad buffer in pp_scan_bytes()" ); 1910 1911 /* It's okay to grow etc. this buffer, and we should throw it 1912 * away when we're done. 1913 */ 1914 b->yy_is_our_buffer = 1; 1915 1916 return b; 1917 } 1918 1919 #ifndef YY_EXIT_FAILURE 1920 #define YY_EXIT_FAILURE 2 1921 #endif 1922 1923 static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner) 1924 { 1925 (void) fprintf( stderr, "%s\n", msg ); 1926 exit( YY_EXIT_FAILURE ); 1927 } 1928 1929 /* Redefine yyless() so it works in section 3 code. */ 1930 1931 #undef yyless 1932 #define yyless(n) \ 1933 do \ 1934 { \ 1935 /* Undo effects of setting up yytext. */ \ 1936 int yyless_macro_arg = (n); \ 1937 YY_LESS_LINENO(yyless_macro_arg);\ 1938 yytext[yyleng] = yyg->yy_hold_char; \ 1939 yyg->yy_c_buf_p = yytext + yyless_macro_arg; \ 1940 yyg->yy_hold_char = *yyg->yy_c_buf_p; \ 1941 *yyg->yy_c_buf_p = '\0'; \ 1942 yyleng = yyless_macro_arg; \ 1943 } \ 1944 while ( 0 ) 1945 1946 /* Accessor methods (get/set functions) to struct members. */ 1947 1948 /** Get the user-defined data for this scanner. 1949 * @param yyscanner The scanner object. 1950 */ 1951 YY_EXTRA_TYPE ppget_extra (yyscan_t yyscanner) 1952 { 1953 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1954 return yyextra; 1955 } 1956 1957 /** Get the current line number. 1958 * @param yyscanner The scanner object. 1959 */ 1960 int ppget_lineno (yyscan_t yyscanner) 1961 { 1962 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1963 1964 if (! YY_CURRENT_BUFFER) 1965 return 0; 1966 1967 return yylineno; 1968 } 1969 1970 /** Get the current column number. 1971 * @param yyscanner The scanner object. 1972 */ 1973 int ppget_column (yyscan_t yyscanner) 1974 { 1975 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1976 1977 if (! YY_CURRENT_BUFFER) 1978 return 0; 1979 1980 return yycolumn; 1981 } 1982 1983 /** Get the input stream. 1984 * @param yyscanner The scanner object. 1985 */ 1986 FILE *ppget_in (yyscan_t yyscanner) 1987 { 1988 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1989 return yyin; 1990 } 1991 1992 /** Get the output stream. 1993 * @param yyscanner The scanner object. 1994 */ 1995 FILE *ppget_out (yyscan_t yyscanner) 1996 { 1997 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 1998 return yyout; 1999 } 2000 2001 /** Get the length of the current token. 2002 * @param yyscanner The scanner object. 2003 */ 2004 yy_size_t ppget_leng (yyscan_t yyscanner) 2005 { 2006 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2007 return yyleng; 2008 } 2009 2010 /** Get the current token. 2011 * @param yyscanner The scanner object. 2012 */ 2013 2014 char *ppget_text (yyscan_t yyscanner) 2015 { 2016 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2017 return yytext; 2018 } 2019 2020 /** Set the user-defined data. This data is never touched by the scanner. 2021 * @param user_defined The data to be associated with this scanner. 2022 * @param yyscanner The scanner object. 2023 */ 2024 void ppset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner) 2025 { 2026 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2027 yyextra = user_defined ; 2028 } 2029 2030 /** Set the current line number. 2031 * @param line_number 2032 * @param yyscanner The scanner object. 2033 */ 2034 void ppset_lineno (int line_number , yyscan_t yyscanner) 2035 { 2036 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2037 2038 /* lineno is only valid if an input buffer exists. */ 2039 if (! YY_CURRENT_BUFFER ) 2040 yy_fatal_error( "ppset_lineno called with no buffer" , yyscanner); 2041 2042 yylineno = line_number; 2043 } 2044 2045 /** Set the current column. 2046 * @param line_number 2047 * @param yyscanner The scanner object. 2048 */ 2049 void ppset_column (int column_no , yyscan_t yyscanner) 2050 { 2051 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2052 2053 /* column is only valid if an input buffer exists. */ 2054 if (! YY_CURRENT_BUFFER ) 2055 yy_fatal_error( "ppset_column called with no buffer" , yyscanner); 2056 2057 yycolumn = column_no; 2058 } 2059 2060 /** Set the input stream. This does not discard the current 2061 * input buffer. 2062 * @param in_str A readable stream. 2063 * @param yyscanner The scanner object. 2064 * @see pp_switch_to_buffer 2065 */ 2066 void ppset_in (FILE * in_str , yyscan_t yyscanner) 2067 { 2068 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2069 yyin = in_str ; 2070 } 2071 2072 void ppset_out (FILE * out_str , yyscan_t yyscanner) 2073 { 2074 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2075 yyout = out_str ; 2076 } 2077 2078 int ppget_debug (yyscan_t yyscanner) 2079 { 2080 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2081 return yy_flex_debug; 2082 } 2083 2084 void ppset_debug (int bdebug , yyscan_t yyscanner) 2085 { 2086 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2087 yy_flex_debug = bdebug ; 2088 } 2089 2090 /* Accessor methods for yylval and yylloc */ 2091 2092 YYSTYPE * ppget_lval (yyscan_t yyscanner) 2093 { 2094 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2095 return yylval; 2096 } 2097 2098 void ppset_lval (YYSTYPE * yylval_param , yyscan_t yyscanner) 2099 { 2100 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2101 yylval = yylval_param; 2102 } 2103 2104 YYLTYPE *ppget_lloc (yyscan_t yyscanner) 2105 { 2106 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2107 return yylloc; 2108 } 2109 2110 void ppset_lloc (YYLTYPE * yylloc_param , yyscan_t yyscanner) 2111 { 2112 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2113 yylloc = yylloc_param; 2114 } 2115 2116 /* User-visible API */ 2117 2118 /* pplex_init is special because it creates the scanner itself, so it is 2119 * the ONLY reentrant function that doesn't take the scanner as the last argument. 2120 * That's why we explicitly handle the declaration, instead of using our macros. 2121 */ 2122 2123 int pplex_init(yyscan_t* ptr_yy_globals) 2124 2125 { 2126 if (ptr_yy_globals == NULL){ 2127 errno = EINVAL; 2128 return 1; 2129 } 2130 2131 *ptr_yy_globals = (yyscan_t) ppalloc ( sizeof( struct yyguts_t ), NULL ); 2132 2133 if (*ptr_yy_globals == NULL){ 2134 errno = ENOMEM; 2135 return 1; 2136 } 2137 2138 /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */ 2139 memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); 2140 2141 return yy_init_globals ( *ptr_yy_globals ); 2142 } 2143 2144 /* pplex_init_extra has the same functionality as pplex_init, but follows the 2145 * convention of taking the scanner as the last argument. Note however, that 2146 * this is a *pointer* to a scanner, as it will be allocated by this call (and 2147 * is the reason, too, why this function also must handle its own declaration). 2148 * The user defined value in the first argument will be available to ppalloc in 2149 * the yyextra field. 2150 */ 2151 2152 int pplex_init_extra(YY_EXTRA_TYPE yy_user_defined,yyscan_t* ptr_yy_globals ) 2153 2154 { 2155 struct yyguts_t dummy_yyguts; 2156 2157 ppset_extra (yy_user_defined, &dummy_yyguts); 2158 2159 if (ptr_yy_globals == NULL){ 2160 errno = EINVAL; 2161 return 1; 2162 } 2163 2164 *ptr_yy_globals = (yyscan_t) ppalloc ( sizeof( struct yyguts_t ), &dummy_yyguts ); 2165 2166 if (*ptr_yy_globals == NULL){ 2167 errno = ENOMEM; 2168 return 1; 2169 } 2170 2171 /* By setting to 0xAA, we expose bugs in 2172 yy_init_globals. Leave at 0x00 for releases. */ 2173 memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t)); 2174 2175 ppset_extra (yy_user_defined, *ptr_yy_globals); 2176 2177 return yy_init_globals ( *ptr_yy_globals ); 2178 } 2179 2180 static int yy_init_globals (yyscan_t yyscanner) 2181 { 2182 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2183 /* Initialization is the same as for the non-reentrant scanner. 2184 * This function is called from pplex_destroy(), so don't allocate here. 2185 */ 2186 2187 yyg->yy_buffer_stack = 0; 2188 yyg->yy_buffer_stack_top = 0; 2189 yyg->yy_buffer_stack_max = 0; 2190 yyg->yy_c_buf_p = (char *) 0; 2191 yyg->yy_init = 0; 2192 yyg->yy_start = 0; 2193 2194 yyg->yy_start_stack_ptr = 0; 2195 yyg->yy_start_stack_depth = 0; 2196 yyg->yy_start_stack = NULL; 2197 2198 /* Defined in main.c */ 2199 #ifdef YY_STDINIT 2200 yyin = stdin; 2201 yyout = stdout; 2202 #else 2203 yyin = (FILE *) 0; 2204 yyout = (FILE *) 0; 2205 #endif 2206 2207 /* For future reference: Set errno on error, since we are called by 2208 * pplex_init() 2209 */ 2210 return 0; 2211 } 2212 2213 /* pplex_destroy is for both reentrant and non-reentrant scanners. */ 2214 int pplex_destroy (yyscan_t yyscanner) 2215 { 2216 struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; 2217 2218 /* Pop the buffer stack, destroying each element. */ 2219 while(YY_CURRENT_BUFFER){ 2220 pp_delete_buffer(YY_CURRENT_BUFFER ,yyscanner ); 2221 YY_CURRENT_BUFFER_LVALUE = NULL; 2222 pppop_buffer_state(yyscanner); 2223 } 2224 2225 /* Destroy the stack itself. */ 2226 ppfree(yyg->yy_buffer_stack ,yyscanner); 2227 yyg->yy_buffer_stack = NULL; 2228 2229 /* Destroy the start condition stack. */ 2230 ppfree(yyg->yy_start_stack ,yyscanner ); 2231 yyg->yy_start_stack = NULL; 2232 2233 /* Reset the globals. This is important in a non-reentrant scanner so the next time 2234 * pplex() is called, initialization will occur. */ 2235 yy_init_globals( yyscanner); 2236 2237 /* Destroy the main struct (reentrant only). */ 2238 ppfree ( yyscanner , yyscanner ); 2239 yyscanner = NULL; 2240 return 0; 2241 } 2242 2243 /* 2244 * Internal utility routines. 2245 */ 2246 2247 #ifndef yytext_ptr 2248 static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner) 2249 { 2250 register int i; 2251 for ( i = 0; i < n; ++i ) 2252 s1[i] = s2[i]; 2253 } 2254 #endif 2255 2256 #ifdef YY_NEED_STRLEN 2257 static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner) 2258 { 2259 register int n; 2260 for ( n = 0; s[n]; ++n ) 2261 ; 2262 2263 return n; 2264 } 2265 #endif 2266 2267 void *ppalloc (yy_size_t size , yyscan_t yyscanner) 2268 { 2269 return (void *) malloc( size ); 2270 } 2271 2272 void *pprealloc (void * ptr, yy_size_t size , yyscan_t yyscanner) 2273 { 2274 /* The cast to (char *) in the following accommodates both 2275 * implementations that use char* generic pointers, and those 2276 * that use void* generic pointers. It works with the latter 2277 * because both ANSI C and C++ allow castless assignment from 2278 * any pointer type to void*, and deal with argument conversions 2279 * as though doing an assignment. 2280 */ 2281 return (void *) realloc( (char *) ptr, size ); 2282 } 2283 2284 void ppfree (void * ptr , yyscan_t yyscanner) 2285 { 2286 free( (char *) ptr ); /* see pprealloc() for (char *) cast */ 2287 } 2288 2289 #define YYTABLES_NAME "yytables" 2290 2291 namespace pp { 2292 2293 // TODO(alokp): Maximum token length should ideally be specified by 2294 // the preprocessor client, i.e., the compiler. 2295 const size_t Tokenizer::kMaxTokenLength = 256; 2296 2297 Tokenizer::Tokenizer(Diagnostics* diagnostics) : mHandle(0) 2298 { 2299 mContext.diagnostics = diagnostics; 2300 } 2301 2302 Tokenizer::~Tokenizer() 2303 { 2304 destroyScanner(); 2305 } 2306 2307 bool Tokenizer::init(size_t count, const char* const string[], const int length[]) 2308 { 2309 if ((count > 0) && (string == 0)) return false; 2310 2311 mContext.input = Input(count, string, length); 2312 return initScanner(); 2313 } 2314 2315 void Tokenizer::setFileNumber(int file) 2316 { 2317 // We use column number as file number. 2318 // See macro yyfileno. 2319 ppset_column(file,mHandle); 2320 } 2321 2322 void Tokenizer::setLineNumber(int line) 2323 { 2324 ppset_lineno(line,mHandle); 2325 } 2326 2327 void Tokenizer::lex(Token* token) 2328 { 2329 token->type = pplex(&token->text,&token->location,mHandle); 2330 if (token->text.size() > kMaxTokenLength) 2331 { 2332 mContext.diagnostics->report(Diagnostics::TOKEN_TOO_LONG, 2333 token->location, token->text); 2334 token->text.erase(kMaxTokenLength); 2335 } 2336 2337 token->flags = 0; 2338 2339 token->setAtStartOfLine(mContext.lineStart); 2340 mContext.lineStart = token->type == '\n'; 2341 2342 token->setHasLeadingSpace(mContext.leadingSpace); 2343 mContext.leadingSpace = false; 2344 } 2345 2346 bool Tokenizer::initScanner() 2347 { 2348 if ((mHandle == NULL) && pplex_init_extra(&mContext,&mHandle)) 2349 return false; 2350 2351 pprestart(0,mHandle); 2352 return true; 2353 } 2354 2355 void Tokenizer::destroyScanner() 2356 { 2357 if (mHandle == NULL) 2358 return; 2359 2360 pplex_destroy(mHandle); 2361 mHandle = NULL; 2362 } 2363 2364 } // namespace pp 2365 2366