
of different parsers having different YYSTYPE unions that they want to use with it. I defined a new union core_YYSTYPE that is just the (very short) list of semantic values returned by the core scanner. I had originally worried that this would require an extra interface layer, but actually we can have parser.c's base_yylex (formerly filtered_base_yylex) take care of that at no extra cost. Names associated with the core scanner are now "core_yy_foo", with "base_yy_foo" being used in the core Bison parser and the parser.c interface layer. This solves the last serious stumbling block to eliminating plpgsql's separate lexer. One restriction that will still be present is that plpgsql and the core will have to agree on the token numbers assigned to tokens that can be returned by the core lexer. Since Bison doesn't seem willing to accept external assignments of those numbers, we'll have to live with decreeing that core and plpgsql grammars declare these tokens first and in the same order.
74 lines
2.2 KiB
C
74 lines
2.2 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* gramparse.h
|
|
* Shared definitions for the "raw" parser (flex and bison phases only)
|
|
*
|
|
* NOTE: this file is only meant to be included in the core parsing files,
|
|
* ie, parser.c, gram.y, scan.l, and keywords.c. Definitions that are needed
|
|
* outside the core parser should be in parser.h.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/parser/gramparse.h,v 1.50 2009/11/09 18:38:48 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
#ifndef GRAMPARSE_H
|
|
#define GRAMPARSE_H
|
|
|
|
#include "nodes/parsenodes.h"
|
|
#include "parser/scanner.h"
|
|
|
|
/*
|
|
* NB: include gram.h only AFTER including scanner.h, because scanner.h
|
|
* is what #defines YYLTYPE.
|
|
*/
|
|
#include "parser/gram.h"
|
|
|
|
/*
|
|
* The YY_EXTRA data that a flex scanner allows us to pass around. Private
|
|
* state needed for raw parsing/lexing goes here.
|
|
*/
|
|
typedef struct base_yy_extra_type
|
|
{
|
|
/*
|
|
* Fields used by the core scanner.
|
|
*/
|
|
core_yy_extra_type core_yy_extra;
|
|
|
|
/*
|
|
* State variables for base_yylex().
|
|
*/
|
|
bool have_lookahead; /* is lookahead info valid? */
|
|
int lookahead_token; /* one-token lookahead */
|
|
core_YYSTYPE lookahead_yylval; /* yylval for lookahead token */
|
|
YYLTYPE lookahead_yylloc; /* yylloc for lookahead token */
|
|
|
|
/*
|
|
* State variables that belong to the grammar.
|
|
*/
|
|
List *parsetree; /* final parse result is delivered here */
|
|
} base_yy_extra_type;
|
|
|
|
/*
|
|
* In principle we should use yyget_extra() to fetch the yyextra field
|
|
* from a yyscanner struct. However, flex always puts that field first,
|
|
* and this is sufficiently performance-critical to make it seem worth
|
|
* cheating a bit to use an inline macro.
|
|
*/
|
|
#define pg_yyget_extra(yyscanner) (*((base_yy_extra_type **) (yyscanner)))
|
|
|
|
|
|
/* from parser.c */
|
|
extern int base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp,
|
|
core_yyscan_t yyscanner);
|
|
|
|
/* from gram.y */
|
|
extern void parser_init(base_yy_extra_type *yyext);
|
|
extern int base_yyparse(core_yyscan_t yyscanner);
|
|
|
|
#endif /* GRAMPARSE_H */
|