1 /*------------------------------------------------------------------------- 2 * 3 * gramparse.h 4 * Shared definitions for the "raw" parser (flex and bison phases only) 5 * 6 * NOTE: this file is only meant to be included in the core parsing files, 7 * ie, parser.c, gram.y, scan.l, and src/common/keywords.c. 8 * Definitions that are needed outside the core parser should be in parser.h. 9 * 10 * 11 * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group 12 * Portions Copyright (c) 1994, Regents of the University of California 13 * 14 * src/include/parser/gramparse.h 15 * 16 *------------------------------------------------------------------------- 17 */ 18 19 #ifndef GRAMPARSE_H 20 #define GRAMPARSE_H 21 22 #include "nodes/parsenodes.h" 23 #include "parser/scanner.h" 24 25 /* 26 * NB: include gram.h only AFTER including scanner.h, because scanner.h 27 * is what #defines YYLTYPE. 28 */ 29 #include "parser/gram.h" 30 31 /* 32 * The YY_EXTRA data that a flex scanner allows us to pass around. Private 33 * state needed for raw parsing/lexing goes here. 34 */ 35 typedef struct base_yy_extra_type 36 { 37 /* 38 * Fields used by the core scanner. 39 */ 40 core_yy_extra_type core_yy_extra; 41 42 /* 43 * State variables for base_yylex(). 44 */ 45 bool have_lookahead; /* is lookahead info valid? */ 46 int lookahead_token; /* one-token lookahead */ 47 core_YYSTYPE lookahead_yylval; /* yylval for lookahead token */ 48 YYLTYPE lookahead_yylloc; /* yylloc for lookahead token */ 49 char *lookahead_end; /* end of current token */ 50 char lookahead_hold_char; /* to be put back at *lookahead_end */ 51 52 /* 53 * State variables that belong to the grammar. 54 */ 55 List *parsetree; /* final parse result is delivered here */ 56 } base_yy_extra_type; 57 58 /* 59 * In principle we should use yyget_extra() to fetch the yyextra field 60 * from a yyscanner struct. However, flex always puts that field first, 61 * and this is sufficiently performance-critical to make it seem worth 62 * cheating a bit to use an inline macro. 63 */ 64 #define pg_yyget_extra(yyscanner) (*((base_yy_extra_type **) (yyscanner))) 65 66 67 /* from parser.c */ 68 extern int base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, 69 core_yyscan_t yyscanner); 70 71 /* from gram.y */ 72 extern void parser_init(base_yy_extra_type *yyext); 73 extern int base_yyparse(core_yyscan_t yyscanner); 74 75 #endif /* GRAMPARSE_H */ 76