| %{ |
| /*------------------------------------------------------------------------- |
| * |
| * bootscanner.l |
| * a lexical scanner for the bootstrap parser |
| * |
| * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * |
| * IDENTIFICATION |
| * $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.48 2009/01/01 17:23:36 momjian Exp $ |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #include "postgres.h" |
| |
| #include "access/attnum.h" |
| #include "access/htup.h" |
| #include "access/itup.h" |
| #include "access/skey.h" |
| #include "access/tupdesc.h" |
| #include "bootstrap/bootstrap.h" |
| #include "catalog/pg_am.h" |
| #include "catalog/pg_attribute.h" |
| #include "catalog/pg_class.h" |
| #include "nodes/nodes.h" |
| #include "nodes/parsenodes.h" |
| #include "nodes/pg_list.h" |
| #include "nodes/primnodes.h" |
| #include "parser/scansup.h" |
| #include "rewrite/prs2lock.h" |
| #include "storage/block.h" |
| #include "storage/fd.h" |
| #include "storage/itemptr.h" |
| #include "storage/off.h" |
| #include "utils/rel.h" |
| |
| #define unify_version(a,b,c) ((a<<16)+(b<<8)+c) |
| |
| #if unify_version(YY_FLEX_MAJOR_VERSION,YY_FLEX_MINOR_VERSION,YY_FLEX_SUBMINOR_VERSION) < unify_version(2,5,35) |
| /* These routines aren't used, but are defined to supress warnings from gcc */ |
| int boot_yyget_lineno (void); |
| FILE *boot_yyget_in (void); |
| FILE *boot_yyget_out (void); |
| int boot_yyget_leng (void); |
| char *boot_yyget_text (void); |
| void boot_yyset_lineno (int line_number ); |
| void boot_yyset_in (FILE * in_str ); |
| void boot_yyset_out (FILE * out_str ); |
| int boot_yyget_debug (void); |
| void boot_yyset_debug (int bdebug ); |
| int boot_yylex_destroy (void); |
| #endif |
| |
| |
| |
| |
| |
| /* Not needed now that this file is compiled as part of bootparse. */ |
| /* #include "bootparse.h" */ |
| |
| |
| /* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */ |
| #undef fprintf |
| #define fprintf(file, fmt, msg) ereport(ERROR, (errmsg_internal("%s", msg))) |
| |
| |
| static int yyline = 1; /* line number for error reporting */ |
| |
| %} |
| |
| %option 8bit |
| %option never-interactive |
| %option nodefault |
| %option noinput |
| %option nounput |
| %option noyywrap |
| %option prefix="boot_yy" |
| |
| |
| D [0-9] |
| oct \\{D}{D}{D} |
| Exp [Ee][-+]?{D}+ |
| id ([A-Za-z0-9_]|{oct}|\-)+ |
| sid \"([^\"])*\" |
| arrayid [A-Za-z0-9_]+\[{D}*\] |
| |
| %% |
| |
| open { return(OPEN); } |
| |
| close { return(XCLOSE); } |
| |
| create { return(XCREATE); } |
| |
| OID { return(OBJ_ID); } |
| bootstrap { return(XBOOTSTRAP); } |
| "shared_relation" { return(XSHARED_RELATION); } |
| "without_oids" { return(XWITHOUT_OIDS); } |
| _null_ { return(NULLVAL); } |
| |
| insert { return(INSERT_TUPLE); } |
| |
| "," { return(COMMA); } |
| "=" { return(EQUALS); } |
| "(" { return(LPAREN); } |
| ")" { return(RPAREN); } |
| |
| [\n] { yyline++; } |
| [\t] ; |
| " " ; |
| |
| ^\#[^\n]* ; /* drop everything after "#" for comments */ |
| |
| |
| "declare" { return(XDECLARE); } |
| "build" { return(XBUILD); } |
| "indices" { return(INDICES); } |
| "unique" { return(UNIQUE); } |
| "index" { return(INDEX); } |
| "on" { return(ON); } |
| "using" { return(USING); } |
| "toast" { return(XTOAST); } |
| |
| {arrayid} { |
| yylval.ival = EnterString(MapArrayTypeName((char*)yytext)); |
| return(ID); |
| } |
| {id} { |
| char *newid = scanstr((char*)yytext); |
| yylval.ival = EnterString(newid); |
| pfree(newid); |
| return(ID); |
| } |
| {sid} { |
| char *newid; |
| yytext[strlen(yytext)-1] = '\0'; /* strip off quotes */ |
| newid = scanstr((char*)yytext+1); |
| yylval.ival = EnterString(newid); |
| pfree(newid); |
| yytext[strlen(yytext)] = '"'; /* restore quotes */ |
| return(ID); |
| } |
| |
| (-)?{D}+"."{D}*({Exp})? | |
| (-)?{D}*"."{D}+({Exp})? | |
| (-)?{D}+{Exp} { |
| yylval.ival = EnterString((char*)yytext); |
| return(CONST_P); |
| } |
| |
| . { |
| elog(ERROR, "syntax error at line %d: unexpected character \"%s\"", yyline, yytext); |
| } |
| |
| |
| |
| %% |
| |
| void |
| yyerror(const char *message) |
| { |
| elog(ERROR, "%s at line %d", message, yyline); |
| } |