Lex/yacc source cleanup like indent.
This commit is contained in:
parent
319dbfa736
commit
23db70bf73
|
@ -2,13 +2,13 @@
|
|||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* backendparse.y--
|
||||
* yacc parser grammer for the "backend" initialization program.
|
||||
* yacc parser grammer for the "backend" initialization program.
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.4 1996/11/13 20:47:45 scrappy Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootparse.y,v 1.5 1997/09/08 03:19:50 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -16,11 +16,11 @@
|
|||
#include "postgres.h"
|
||||
|
||||
#include "catalog/pg_attribute.h"
|
||||
#include "access/attnum.h"
|
||||
#include "access/attnum.h"
|
||||
#include "nodes/pg_list.h"
|
||||
#include "access/tupdesc.h"
|
||||
#include "access/tupdesc.h"
|
||||
#include "storage/fd.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_class.h"
|
||||
#include "nodes/nodes.h"
|
||||
#include "rewrite/prs2lock.h"
|
||||
|
@ -57,24 +57,27 @@
|
|||
|
||||
#include "miscadmin.h"
|
||||
|
||||
#define DO_START { StartTransactionCommand();\
|
||||
}
|
||||
#define DO_START { \
|
||||
StartTransactionCommand();\
|
||||
}
|
||||
|
||||
#define DO_END { CommitTransactionCommand();\
|
||||
if (!Quiet) { EMITPROMPT; }\
|
||||
fflush(stdout); \
|
||||
}
|
||||
#define DO_END { \
|
||||
CommitTransactionCommand();\
|
||||
if (!Quiet) { EMITPROMPT; }\
|
||||
fflush(stdout); \
|
||||
}
|
||||
|
||||
int num_tuples_read = 0;
|
||||
static Oid objectid;
|
||||
|
||||
%}
|
||||
|
||||
%union {
|
||||
List *list;
|
||||
IndexElem *ielem;
|
||||
char *str;
|
||||
int ival;
|
||||
%union
|
||||
{
|
||||
List *list;
|
||||
IndexElem *ielem;
|
||||
char *str;
|
||||
int ival;
|
||||
}
|
||||
|
||||
%type <list> arg_list
|
||||
|
@ -84,7 +87,7 @@ static Oid objectid;
|
|||
|
||||
%token <ival> CONST ID
|
||||
%token OPEN XCLOSE XCREATE INSERT_TUPLE
|
||||
%token STRING XDEFINE
|
||||
%token STRING XDEFINE
|
||||
%token XDECLARE INDEX ON USING XBUILD INDICES
|
||||
%token COMMA EQUALS LPAREN RPAREN
|
||||
%token OBJ_ID XBOOTSTRAP NULLVAL
|
||||
|
@ -96,228 +99,233 @@ static Oid objectid;
|
|||
%%
|
||||
|
||||
TopLevel:
|
||||
Queries
|
||||
|
|
||||
;
|
||||
Queries
|
||||
|
|
||||
;
|
||||
|
||||
Queries:
|
||||
Query
|
||||
| Queries Query
|
||||
;
|
||||
Query
|
||||
| Queries Query
|
||||
;
|
||||
|
||||
Query :
|
||||
OpenStmt
|
||||
| CloseStmt
|
||||
| CreateStmt
|
||||
| InsertStmt
|
||||
| DeclareIndexStmt
|
||||
| BuildIndsStmt
|
||||
;
|
||||
OpenStmt
|
||||
| CloseStmt
|
||||
| CreateStmt
|
||||
| InsertStmt
|
||||
| DeclareIndexStmt
|
||||
| BuildIndsStmt
|
||||
;
|
||||
|
||||
OpenStmt:
|
||||
OPEN ident
|
||||
{
|
||||
DO_START;
|
||||
boot_openrel(LexIDStr($2));
|
||||
DO_END;
|
||||
}
|
||||
;
|
||||
OpenStmt:
|
||||
OPEN ident
|
||||
{
|
||||
DO_START;
|
||||
boot_openrel(LexIDStr($2));
|
||||
DO_END;
|
||||
}
|
||||
;
|
||||
|
||||
CloseStmt:
|
||||
XCLOSE ident %prec low
|
||||
{
|
||||
DO_START;
|
||||
closerel(LexIDStr($2));
|
||||
DO_END;
|
||||
}
|
||||
| XCLOSE %prec high
|
||||
{
|
||||
DO_START;
|
||||
closerel(NULL);
|
||||
DO_END;
|
||||
}
|
||||
;
|
||||
XCLOSE ident %prec low
|
||||
{
|
||||
DO_START;
|
||||
closerel(LexIDStr($2));
|
||||
DO_END;
|
||||
}
|
||||
| XCLOSE %prec high
|
||||
{
|
||||
DO_START;
|
||||
closerel(NULL);
|
||||
DO_END;
|
||||
}
|
||||
;
|
||||
|
||||
CreateStmt:
|
||||
XCREATE optbootstrap ident LPAREN
|
||||
{
|
||||
DO_START;
|
||||
numattr=(int)0;
|
||||
}
|
||||
typelist
|
||||
{
|
||||
if (!Quiet) putchar('\n');
|
||||
DO_END;
|
||||
}
|
||||
RPAREN
|
||||
{
|
||||
DO_START;
|
||||
XCREATE optbootstrap ident LPAREN
|
||||
{
|
||||
DO_START;
|
||||
numattr=(int)0;
|
||||
}
|
||||
typelist
|
||||
{
|
||||
if (!Quiet)
|
||||
putchar('\n');
|
||||
DO_END;
|
||||
}
|
||||
RPAREN
|
||||
{
|
||||
DO_START;
|
||||
|
||||
if ($2) {
|
||||
extern Relation reldesc;
|
||||
TupleDesc tupdesc;
|
||||
if ($2)
|
||||
{
|
||||
extern Relation reldesc;
|
||||
TupleDesc tupdesc;
|
||||
|
||||
if (reldesc) {
|
||||
puts("create bootstrap: Warning, open relation");
|
||||
puts("exists, closing first");
|
||||
closerel(NULL);
|
||||
}
|
||||
if (DebugMode)
|
||||
puts("creating bootstrap relation");
|
||||
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
||||
reldesc = heap_creatr(LexIDStr($3),
|
||||
DEFAULT_SMGR,
|
||||
tupdesc);
|
||||
if (DebugMode)
|
||||
puts("bootstrap relation created ok");
|
||||
} else {
|
||||
Oid id;
|
||||
TupleDesc tupdesc;
|
||||
/* extern Oid heap_create();*/
|
||||
if (reldesc)
|
||||
{
|
||||
puts("create bootstrap: Warning, open relation");
|
||||
puts("exists, closing first");
|
||||
closerel(NULL);
|
||||
}
|
||||
if (DebugMode)
|
||||
puts("creating bootstrap relation");
|
||||
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
||||
reldesc = heap_creatr(LexIDStr($3),
|
||||
DEFAULT_SMGR,
|
||||
tupdesc);
|
||||
if (DebugMode)
|
||||
puts("bootstrap relation created ok");
|
||||
}
|
||||
else
|
||||
{
|
||||
Oid id;
|
||||
TupleDesc tupdesc;
|
||||
/* extern Oid heap_create();*/
|
||||
|
||||
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
||||
id = heap_create(LexIDStr($3),
|
||||
NULL,
|
||||
'n',
|
||||
DEFAULT_SMGR,
|
||||
tupdesc);
|
||||
if (!Quiet)
|
||||
printf("CREATED relation %s with OID %d\n",
|
||||
LexIDStr($3), id);
|
||||
}
|
||||
DO_END;
|
||||
if (DebugMode)
|
||||
puts("Commit End");
|
||||
}
|
||||
;
|
||||
tupdesc = CreateTupleDesc(numattr,attrtypes);
|
||||
id = heap_create(LexIDStr($3),
|
||||
NULL,
|
||||
'n',
|
||||
DEFAULT_SMGR,
|
||||
tupdesc);
|
||||
if (!Quiet)
|
||||
printf("CREATED relation %s with OID %d\n",
|
||||
LexIDStr($3), id);
|
||||
}
|
||||
DO_END;
|
||||
if (DebugMode)
|
||||
puts("Commit End");
|
||||
}
|
||||
;
|
||||
|
||||
InsertStmt:
|
||||
INSERT_TUPLE optoideq
|
||||
{
|
||||
DO_START;
|
||||
if (DebugMode)
|
||||
printf("tuple %d<", $2);
|
||||
num_tuples_read = 0;
|
||||
}
|
||||
LPAREN tuplelist RPAREN
|
||||
{
|
||||
if (num_tuples_read != numattr)
|
||||
elog(WARN,"incorrect number of values for tuple");
|
||||
if (reldesc == (Relation)NULL) {
|
||||
elog(WARN,"must OPEN RELATION before INSERT\n");
|
||||
err_out();
|
||||
}
|
||||
if (DebugMode)
|
||||
puts("Insert Begin");
|
||||
objectid = $2;
|
||||
InsertOneTuple(objectid);
|
||||
if (DebugMode)
|
||||
puts("Insert End");
|
||||
if (!Quiet) { putchar('\n'); }
|
||||
DO_END;
|
||||
if (DebugMode)
|
||||
puts("Transaction End");
|
||||
}
|
||||
;
|
||||
INSERT_TUPLE optoideq
|
||||
{
|
||||
DO_START;
|
||||
if (DebugMode)
|
||||
printf("tuple %d<", $2);
|
||||
num_tuples_read = 0;
|
||||
}
|
||||
LPAREN tuplelist RPAREN
|
||||
{
|
||||
if (num_tuples_read != numattr)
|
||||
elog(WARN,"incorrect number of values for tuple");
|
||||
if (reldesc == (Relation)NULL)
|
||||
{
|
||||
elog(WARN,"must OPEN RELATION before INSERT\n");
|
||||
err_out();
|
||||
}
|
||||
if (DebugMode)
|
||||
puts("Insert Begin");
|
||||
objectid = $2;
|
||||
InsertOneTuple(objectid);
|
||||
if (DebugMode)
|
||||
puts("Insert End");
|
||||
if (!Quiet)
|
||||
putchar('\n');
|
||||
DO_END;
|
||||
if (DebugMode)
|
||||
puts("Transaction End");
|
||||
}
|
||||
;
|
||||
|
||||
DeclareIndexStmt:
|
||||
XDECLARE INDEX ident ON ident USING ident LPAREN index_params RPAREN
|
||||
{
|
||||
List *params;
|
||||
XDECLARE INDEX ident ON ident USING ident LPAREN index_params RPAREN
|
||||
{
|
||||
List *params;
|
||||
|
||||
DO_START;
|
||||
DO_START;
|
||||
|
||||
params = lappend(NIL, (List*)$9);
|
||||
DefineIndex(LexIDStr($5),
|
||||
LexIDStr($3),
|
||||
LexIDStr($7),
|
||||
params, NIL, 0, 0, NIL);
|
||||
DO_END;
|
||||
}
|
||||
;
|
||||
params = lappend(NIL, (List*)$9);
|
||||
DefineIndex(LexIDStr($5),
|
||||
LexIDStr($3),
|
||||
LexIDStr($7),
|
||||
params, NIL, 0, 0, NIL);
|
||||
DO_END;
|
||||
}
|
||||
;
|
||||
|
||||
BuildIndsStmt:
|
||||
XBUILD INDICES { build_indices(); }
|
||||
XBUILD INDICES { build_indices(); }
|
||||
|
||||
index_params:
|
||||
index_on ident
|
||||
{
|
||||
IndexElem *n = (IndexElem*)$1;
|
||||
n->class = LexIDStr($2);
|
||||
$$ = n;
|
||||
}
|
||||
index_on ident
|
||||
{
|
||||
IndexElem *n = (IndexElem*)$1;
|
||||
n->class = LexIDStr($2);
|
||||
$$ = n;
|
||||
}
|
||||
|
||||
index_on:
|
||||
ident
|
||||
{
|
||||
IndexElem *n = makeNode(IndexElem);
|
||||
n->name = LexIDStr($1);
|
||||
$$ = n;
|
||||
}
|
||||
| ident LPAREN arg_list RPAREN
|
||||
{
|
||||
IndexElem *n = makeNode(IndexElem);
|
||||
n->name = LexIDStr($1);
|
||||
n->args = (List*)$3;
|
||||
$$ = n;
|
||||
}
|
||||
ident
|
||||
{
|
||||
IndexElem *n = makeNode(IndexElem);
|
||||
n->name = LexIDStr($1);
|
||||
$$ = n;
|
||||
}
|
||||
| ident LPAREN arg_list RPAREN
|
||||
{
|
||||
IndexElem *n = makeNode(IndexElem);
|
||||
n->name = LexIDStr($1);
|
||||
n->args = (List*)$3;
|
||||
$$ = n;
|
||||
}
|
||||
|
||||
arg_list:
|
||||
ident
|
||||
{
|
||||
$$ = lappend(NIL, makeString(LexIDStr($1)));
|
||||
}
|
||||
| arg_list COMMA ident
|
||||
{
|
||||
$$ = lappend((List*)$1, makeString(LexIDStr($3)));
|
||||
}
|
||||
|
||||
ident
|
||||
{
|
||||
$$ = lappend(NIL, makeString(LexIDStr($1)));
|
||||
}
|
||||
| arg_list COMMA ident
|
||||
{
|
||||
$$ = lappend((List*)$1, makeString(LexIDStr($3)));
|
||||
}
|
||||
|
||||
optbootstrap:
|
||||
XBOOTSTRAP { $$ = 1; }
|
||||
| { $$ = 0; }
|
||||
;
|
||||
XBOOTSTRAP { $$ = 1; }
|
||||
| { $$ = 0; }
|
||||
;
|
||||
|
||||
typelist:
|
||||
typething
|
||||
| typelist COMMA typething
|
||||
;
|
||||
typething
|
||||
| typelist COMMA typething
|
||||
;
|
||||
|
||||
typething:
|
||||
ident EQUALS ident
|
||||
{
|
||||
if(++numattr > MAXATTR)
|
||||
elog(FATAL,"Too many attributes\n");
|
||||
DefineAttr(LexIDStr($1),LexIDStr($3),numattr-1);
|
||||
if (DebugMode)
|
||||
printf("\n");
|
||||
}
|
||||
;
|
||||
ident EQUALS ident
|
||||
{
|
||||
if(++numattr > MAXATTR)
|
||||
elog(FATAL,"Too many attributes\n");
|
||||
DefineAttr(LexIDStr($1),LexIDStr($3),numattr-1);
|
||||
if (DebugMode)
|
||||
printf("\n");
|
||||
}
|
||||
;
|
||||
|
||||
optoideq:
|
||||
OBJ_ID EQUALS ident { $$ = atol(LexIDStr($3)); }
|
||||
| { extern Oid newoid(); $$ = newoid(); }
|
||||
;
|
||||
OBJ_ID EQUALS ident { $$ = atol(LexIDStr($3)); }
|
||||
| { extern Oid newoid(); $$ = newoid(); }
|
||||
;
|
||||
|
||||
tuplelist:
|
||||
tuple
|
||||
| tuplelist tuple
|
||||
| tuplelist COMMA tuple
|
||||
;
|
||||
tuple
|
||||
| tuplelist tuple
|
||||
| tuplelist COMMA tuple
|
||||
;
|
||||
|
||||
tuple:
|
||||
ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
||||
| const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
||||
| NULLVAL
|
||||
{ InsertOneNull(num_tuples_read++); }
|
||||
;
|
||||
|
||||
ident {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
||||
| const {InsertOneValue(objectid, LexIDStr($1), num_tuples_read++); }
|
||||
| NULLVAL
|
||||
{ InsertOneNull(num_tuples_read++); }
|
||||
;
|
||||
|
||||
const :
|
||||
CONST { $$=yylval.ival; }
|
||||
;
|
||||
CONST { $$=yylval.ival; }
|
||||
;
|
||||
|
||||
ident :
|
||||
ID { $$=yylval.ival; }
|
||||
;
|
||||
ID { $$=yylval.ival; }
|
||||
;
|
||||
%%
|
||||
|
||||
|
||||
|
|
|
@ -2,13 +2,13 @@
|
|||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* bootscanner.lex--
|
||||
* a lexical scanner for the bootstrap parser
|
||||
* a lexical scanner for the bootstrap parser
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootscanner.l,v 1.6 1997/01/10 20:16:26 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/bootstrap/bootscanner.l,v 1.7 1997/09/08 03:19:53 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -29,7 +29,7 @@
|
|||
#include "storage/fd.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_class.h"
|
||||
#include "nodes/nodes.h"
|
||||
#include "nodes/nodes.h"
|
||||
#include "rewrite/prs2lock.h"
|
||||
#include "access/skey.h"
|
||||
#include "access/strat.h"
|
||||
|
@ -38,7 +38,7 @@
|
|||
|
||||
#include "nodes/primnodes.h"
|
||||
#include "utils/nabstime.h"
|
||||
#include "access/htup.h"
|
||||
#include "access/htup.h"
|
||||
#include "utils/tqual.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
|
||||
|
@ -46,82 +46,82 @@
|
|||
|
||||
#include "bootstrap_tokens.h"
|
||||
|
||||
#define YY_NO_UNPUT
|
||||
#define YY_NO_UNPUT
|
||||
|
||||
/* some versions of lex define this as a macro */
|
||||
#if defined(yywrap)
|
||||
#undef yywrap
|
||||
#endif /* yywrap */
|
||||
|
||||
YYSTYPE yylval;
|
||||
int yyline; /* keep track of the line number for error reporting */
|
||||
YYSTYPE yylval;
|
||||
int yyline; /* keep track of the line number for error reporting */
|
||||
|
||||
%}
|
||||
|
||||
D [0-9]
|
||||
oct \\{D}{D}{D}
|
||||
Exp [Ee][-+]?{D}+
|
||||
id ([A-Za-z0-9_]|{oct}|\-)+
|
||||
sid \"([^\"])*\"
|
||||
arrayid [A-Za-z0-9_]+\[{D}*\]
|
||||
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); }
|
||||
open { return(OPEN); }
|
||||
|
||||
close { return(XCLOSE); }
|
||||
close { return(XCLOSE); }
|
||||
|
||||
create { return(XCREATE); }
|
||||
create { return(XCREATE); }
|
||||
|
||||
OID { return(OBJ_ID); }
|
||||
bootstrap { return(XBOOTSTRAP); }
|
||||
_null_ { return(NULLVAL); }
|
||||
OID { return(OBJ_ID); }
|
||||
bootstrap { return(XBOOTSTRAP); }
|
||||
_null_ { return(NULLVAL); }
|
||||
|
||||
insert { return(INSERT_TUPLE); }
|
||||
insert { return(INSERT_TUPLE); }
|
||||
|
||||
"," { return(COMMA); }
|
||||
"=" { return(EQUALS); }
|
||||
"(" { return(LPAREN); }
|
||||
")" { return(RPAREN); }
|
||||
"," { return(COMMA); }
|
||||
"=" { return(EQUALS); }
|
||||
"(" { return(LPAREN); }
|
||||
")" { return(RPAREN); }
|
||||
|
||||
[\n] { yyline++; }
|
||||
[\t] ;
|
||||
" " ;
|
||||
[\n] { yyline++; }
|
||||
[\t] ;
|
||||
" " ;
|
||||
|
||||
^\#[^\n]* ; /* drop everything after "#" for comments */
|
||||
|
||||
|
||||
"declare" { return(XDECLARE); }
|
||||
"build" { return(XBUILD); }
|
||||
"indices" { return(INDICES); }
|
||||
"index" { return(INDEX); }
|
||||
"on" { return(ON); }
|
||||
"using" { return(USING); }
|
||||
{arrayid} {
|
||||
yylval.ival = EnterString(MapArrayTypeName((char*)yytext));
|
||||
return(ID);
|
||||
}
|
||||
{id} {
|
||||
yylval.ival = EnterString(scanstr((char*)yytext));
|
||||
return(ID);
|
||||
}
|
||||
{sid} {
|
||||
yytext[strlen(yytext)-1] = '\0'; /* strip off quotes */
|
||||
yylval.ival = EnterString(scanstr((char*)yytext+1));
|
||||
yytext[strlen(yytext)] = '"'; /* restore quotes */
|
||||
return(ID);
|
||||
}
|
||||
"declare" { return(XDECLARE); }
|
||||
"build" { return(XBUILD); }
|
||||
"indices" { return(INDICES); }
|
||||
"index" { return(INDEX); }
|
||||
"on" { return(ON); }
|
||||
"using" { return(USING); }
|
||||
{arrayid} {
|
||||
yylval.ival = EnterString(MapArrayTypeName((char*)yytext));
|
||||
return(ID);
|
||||
}
|
||||
{id} {
|
||||
yylval.ival = EnterString(scanstr((char*)yytext));
|
||||
return(ID);
|
||||
}
|
||||
{sid} {
|
||||
yytext[strlen(yytext)-1] = '\0'; /* strip off quotes */
|
||||
yylval.ival = EnterString(scanstr((char*)yytext+1));
|
||||
yytext[strlen(yytext)] = '"'; /* restore quotes */
|
||||
return(ID);
|
||||
}
|
||||
|
||||
(-)?{D}+"."{D}*({Exp})? |
|
||||
(-)?{D}*"."{D}+({Exp})? |
|
||||
(-)?{D}+{Exp} {
|
||||
yylval.ival = EnterString((char*)yytext);
|
||||
return(CONST);
|
||||
}
|
||||
(-)?{D}+"."{D}*({Exp})? |
|
||||
(-)?{D}*"."{D}+({Exp})? |
|
||||
(-)?{D}+{Exp} {
|
||||
yylval.ival = EnterString((char*)yytext);
|
||||
return(CONST);
|
||||
}
|
||||
|
||||
. {
|
||||
printf("syntax error %d : -> %s\n", yyline, yytext);
|
||||
}
|
||||
. {
|
||||
printf("syntax error %d : -> %s\n", yyline, yytext);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -130,11 +130,11 @@ insert { return(INSERT_TUPLE); }
|
|||
int
|
||||
yywrap(void)
|
||||
{
|
||||
return 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
yyerror(const char *str)
|
||||
{
|
||||
fprintf(stderr,"\tsyntax error %d : %s",yyline, str);
|
||||
fprintf(stderr,"\tsyntax error %d : %s",yyline, str);
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -2,13 +2,13 @@
|
|||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* scan.l--
|
||||
* lexical scanner for POSTGRES
|
||||
* lexical scanner for POSTGRES
|
||||
*
|
||||
* Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.18 1997/09/05 09:05:48 vadim Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/scan.l,v 1.19 1997/09/08 03:20:04 momjian Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -64,207 +64,207 @@ int llen;
|
|||
char literal[MAX_PARSE_BUFFER];
|
||||
|
||||
%}
|
||||
/* OK, here is a short description of lex/flex rules behavior.
|
||||
* The longest pattern which matches an input string is always chosen.
|
||||
* For equal-length patterns, the first occurring in the rules list is chosen.
|
||||
* INITIAL is the starting condition, to which all non-conditional rules apply.
|
||||
* <xc> is an exclusive condition to allow embedded C-style comments.
|
||||
* When in an exclusive condition, only those rules defined for that condition apply.
|
||||
* So, when in condition <xc>, only strings which would terminate the "extended comment"
|
||||
* trigger any action other than "ignore".
|
||||
* The "extended comment" syntax closely resembles allowable operator syntax.
|
||||
* Therefore, be sure to match _any_ candidate comment, including those with appended
|
||||
* operator-like symbols. - thomas 1997-07-14
|
||||
*/
|
||||
/* OK, here is a short description of lex/flex rules behavior.
|
||||
* The longest pattern which matches an input string is always chosen.
|
||||
* For equal-length patterns, the first occurring in the rules list is chosen.
|
||||
* INITIAL is the starting condition, to which all non-conditional rules apply.
|
||||
* <xc> is an exclusive condition to allow embedded C-style comments.
|
||||
* When in an exclusive condition, only those rules defined for that condition apply.
|
||||
* So, when in condition <xc>, only strings which would terminate the "extended comment"
|
||||
* trigger any action other than "ignore".
|
||||
* The "extended comment" syntax closely resembles allowable operator syntax.
|
||||
* Therefore, be sure to match _any_ candidate comment, including those with appended
|
||||
* operator-like symbols. - thomas 1997-07-14
|
||||
*/
|
||||
|
||||
/* define an exclusive condition to allow extended C-style comments - tgl 1997-07-12 */
|
||||
/* define an exclusive condition to allow extended C-style comments - tgl 1997-07-12 */
|
||||
%x xc
|
||||
/* define an exclusive condition for quoted strings - tgl 1997-07-30 */
|
||||
/* define an exclusive condition for quoted strings - tgl 1997-07-30 */
|
||||
%x xq
|
||||
|
||||
/* We used to allow double-quoted strings, but SQL doesn't so we won't either */
|
||||
quote '
|
||||
xqstart {quote}
|
||||
xqstop {quote}
|
||||
xqdouble {quote}{quote}
|
||||
xqinside [^\']*
|
||||
xqliteral [\\].
|
||||
/* We used to allow double-quoted strings, but SQL doesn't so we won't either */
|
||||
quote '
|
||||
xqstart {quote}
|
||||
xqstop {quote}
|
||||
xqdouble {quote}{quote}
|
||||
xqinside [^\']*
|
||||
xqliteral [\\].
|
||||
|
||||
xcline [\/][\*].*[\*][\/]{space}*\n*
|
||||
xcstart [\/][\*]{op_and_self}*
|
||||
xcstop {op_and_self}*[\*][\/]({space}*|\n)
|
||||
xcinside [^*]*
|
||||
xcstar [^/]
|
||||
xcline [\/][\*].*[\*][\/]{space}*\n*
|
||||
xcstart [\/][\*]{op_and_self}*
|
||||
xcstop {op_and_self}*[\*][\/]({space}*|\n)
|
||||
xcinside [^*]*
|
||||
xcstar [^/]
|
||||
|
||||
digit [0-9]
|
||||
letter [_A-Za-z]
|
||||
letter_or_digit [_A-Za-z0-9]
|
||||
digit [0-9]
|
||||
letter [_A-Za-z]
|
||||
letter_or_digit [_A-Za-z0-9]
|
||||
|
||||
sysfunc SYS_{letter}{letter_or_digit}*
|
||||
sysfunc SYS_{letter}{letter_or_digit}*
|
||||
|
||||
identifier {letter}{letter_or_digit}*
|
||||
identifier {letter}{letter_or_digit}*
|
||||
|
||||
typecast "::"
|
||||
typecast "::"
|
||||
|
||||
self [,()\[\].;$\:\+\-\*\/\<\>\=\|]
|
||||
selfm {self}[\-][\.0-9]
|
||||
self [,()\[\].;$\:\+\-\*\/\<\>\=\|]
|
||||
selfm {self}[\-][\.0-9]
|
||||
|
||||
op_and_self [\~\!\@\#\%\^\&\|\`\?\$\:\+\-\*\/\<\>\=]
|
||||
op_and_self [\~\!\@\#\%\^\&\|\`\?\$\:\+\-\*\/\<\>\=]
|
||||
|
||||
operator {op_and_self}+
|
||||
operatorm {op_and_self}+[\-][\.0-9]
|
||||
operator {op_and_self}+
|
||||
operatorm {op_and_self}+[\-][\.0-9]
|
||||
|
||||
integer -?{digit}+
|
||||
real -?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
|
||||
integer -?{digit}+
|
||||
real -?{digit}+\.{digit}+([Ee][-+]?{digit}+)?
|
||||
|
||||
param \${integer}
|
||||
param \${integer}
|
||||
|
||||
comment "--".*\n
|
||||
comment2 "//".*\n
|
||||
comment "--".*\n
|
||||
comment2 "//".*\n
|
||||
|
||||
space [ \t\n\f]
|
||||
other .
|
||||
space [ \t\n\f]
|
||||
other .
|
||||
|
||||
%%
|
||||
{sysfunc} {
|
||||
yylval.str = pstrdup(SystemFunctionHandler((char *)yytext));
|
||||
return (SCONST);
|
||||
}
|
||||
{sysfunc} {
|
||||
yylval.str = pstrdup(SystemFunctionHandler((char *)yytext));
|
||||
return (SCONST);
|
||||
}
|
||||
|
||||
{comment} { /* ignore */ }
|
||||
{comment2} { /* ignore */ }
|
||||
{comment} { /* ignore */ }
|
||||
{comment2} { /* ignore */ }
|
||||
|
||||
{xcline} { /* ignore */ }
|
||||
{xcline} { /* ignore */ }
|
||||
|
||||
<xc>{xcstar} |
|
||||
{xcstart} { BEGIN(xc); }
|
||||
{xcstart} { BEGIN(xc); }
|
||||
|
||||
<xc>{xcstop} { BEGIN(INITIAL); }
|
||||
|
||||
<xc>{xcinside} { /* ignore */ }
|
||||
|
||||
{xqstart} {
|
||||
BEGIN(xq);
|
||||
llen = 0;
|
||||
*literal = '\0';
|
||||
}
|
||||
BEGIN(xq);
|
||||
llen = 0;
|
||||
*literal = '\0';
|
||||
}
|
||||
<xq>{xqstop} {
|
||||
BEGIN(INITIAL);
|
||||
yylval.str = pstrdup(scanstr(literal));
|
||||
return (SCONST);
|
||||
}
|
||||
BEGIN(INITIAL);
|
||||
yylval.str = pstrdup(scanstr(literal));
|
||||
return (SCONST);
|
||||
}
|
||||
<xq>{xqdouble} |
|
||||
<xq>{xqinside} {
|
||||
if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1)) {
|
||||
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
|
||||
/* not reached */
|
||||
}
|
||||
memcpy(literal+llen, yytext, yyleng+1);
|
||||
llen += yyleng;
|
||||
}
|
||||
<xq>{xqliteral} {
|
||||
if ((llen+yyleng-1) > (MAX_PARSE_BUFFER - 1)) {
|
||||
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
|
||||
/* not reached */
|
||||
}
|
||||
memcpy(literal+llen, yytext+1, yyleng);
|
||||
llen += yyleng-1;
|
||||
}
|
||||
if ((llen+yyleng) > (MAX_PARSE_BUFFER - 1))
|
||||
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
|
||||
memcpy(literal+llen, yytext, yyleng+1);
|
||||
llen += yyleng;
|
||||
}
|
||||
<xq>{xqliteral} {
|
||||
if ((llen+yyleng-1) > (MAX_PARSE_BUFFER - 1))
|
||||
elog(WARN,"quoted string parse buffer of %d chars exceeded",MAX_PARSE_BUFFER);
|
||||
memcpy(literal+llen, yytext+1, yyleng);
|
||||
llen += yyleng-1;
|
||||
}
|
||||
|
||||
{typecast} { return TYPECAST; }
|
||||
{typecast} { return TYPECAST; }
|
||||
|
||||
{selfm} {
|
||||
yyless(yyleng-2);
|
||||
return (yytext[0]);
|
||||
}
|
||||
{self} { return (yytext[0]); }
|
||||
{selfm} {
|
||||
yyless(yyleng-2);
|
||||
return (yytext[0]);
|
||||
}
|
||||
{self} { return (yytext[0]); }
|
||||
|
||||
{operatorm} {
|
||||
yyless(yyleng-2);
|
||||
yylval.str = pstrdup((char*)yytext);
|
||||
return (Op);
|
||||
}
|
||||
{operator} {
|
||||
if (strcmp((char*)yytext,"!=") == 0)
|
||||
yylval.str = pstrdup("<>"); /* compatability */
|
||||
else
|
||||
yylval.str = pstrdup((char*)yytext);
|
||||
return (Op);
|
||||
}
|
||||
{param} { yylval.ival = atoi((char*)&yytext[1]);
|
||||
return (PARAM);
|
||||
}
|
||||
{integer} {
|
||||
yylval.ival = atoi((char*)yytext);
|
||||
return (ICONST);
|
||||
}
|
||||
{real} {
|
||||
char* endptr;
|
||||
errno = 0;
|
||||
yylval.dval = strtod(((char *)yytext),&endptr);
|
||||
if (*endptr != '\0' || errno == ERANGE)
|
||||
elog(WARN,"\tBad float8 input format\n");
|
||||
CheckFloat8Val(yylval.dval);
|
||||
return (FCONST);
|
||||
}
|
||||
{operatorm} {
|
||||
yyless(yyleng-2);
|
||||
yylval.str = pstrdup((char*)yytext);
|
||||
return (Op);
|
||||
}
|
||||
{operator} {
|
||||
if (strcmp((char*)yytext,"!=") == 0)
|
||||
yylval.str = pstrdup("<>"); /* compatability */
|
||||
else
|
||||
yylval.str = pstrdup((char*)yytext);
|
||||
return (Op);
|
||||
}
|
||||
{param} {
|
||||
yylval.ival = atoi((char*)&yytext[1]);
|
||||
return (PARAM);
|
||||
}
|
||||
{integer} {
|
||||
yylval.ival = atoi((char*)yytext);
|
||||
return (ICONST);
|
||||
}
|
||||
{real} {
|
||||
char* endptr;
|
||||
|
||||
errno = 0;
|
||||
yylval.dval = strtod(((char *)yytext),&endptr);
|
||||
if (*endptr != '\0' || errno == ERANGE)
|
||||
elog(WARN,"\tBad float8 input format\n");
|
||||
CheckFloat8Val(yylval.dval);
|
||||
return (FCONST);
|
||||
}
|
||||
{identifier} {
|
||||
int i;
|
||||
ScanKeyword *keyword;
|
||||
int i;
|
||||
ScanKeyword *keyword;
|
||||
|
||||
for(i = strlen(yytext); i >= 0; i--)
|
||||
if (isupper(yytext[i]))
|
||||
yytext[i] = tolower(yytext[i]);
|
||||
|
||||
keyword = ScanKeywordLookup((char*)yytext);
|
||||
if (keyword != NULL) {
|
||||
if ( keyword->value == DEFAULT ) {
|
||||
DefaultStartPosition = CurScanPosition () + yyleng + 1;
|
||||
printf( "default offset is %d\n", DefaultStartPosition);
|
||||
for(i = strlen(yytext); i >= 0; i--)
|
||||
if (isupper(yytext[i]))
|
||||
yytext[i] = tolower(yytext[i]);
|
||||
|
||||
} else if ( keyword->value == CHECK ) {
|
||||
CheckStartPosition = CurScanPosition () + yyleng + 1;
|
||||
printf( "check offset is %d\n", CheckStartPosition);
|
||||
keyword = ScanKeywordLookup((char*)yytext);
|
||||
if (keyword != NULL) {
|
||||
if ( keyword->value == DEFAULT )
|
||||
{
|
||||
DefaultStartPosition = CurScanPosition () + yyleng + 1;
|
||||
printf( "default offset is %d\n", DefaultStartPosition);
|
||||
}
|
||||
else if ( keyword->value == CHECK )
|
||||
{
|
||||
CheckStartPosition = CurScanPosition () + yyleng + 1;
|
||||
printf( "check offset is %d\n", CheckStartPosition);
|
||||
}
|
||||
return (keyword->value);
|
||||
}
|
||||
else
|
||||
{
|
||||
yylval.str = pstrdup((char*)yytext);
|
||||
return (IDENT);
|
||||
}
|
||||
}
|
||||
{space} { /* ignore */ }
|
||||
|
||||
};
|
||||
|
||||
return (keyword->value);
|
||||
} else {
|
||||
yylval.str = pstrdup((char*)yytext);
|
||||
return (IDENT);
|
||||
}
|
||||
}
|
||||
{space} { /* ignore */ }
|
||||
|
||||
{other} { return (yytext[0]); }
|
||||
{other} { return (yytext[0]); }
|
||||
|
||||
%%
|
||||
|
||||
void yyerror(char message[])
|
||||
{
|
||||
elog(WARN, "parser: %s at or near \"%s\"\n", message, yytext);
|
||||
elog(WARN, "parser: %s at or near \"%s\"\n", message, yytext);
|
||||
}
|
||||
|
||||
int yywrap()
|
||||
{
|
||||
return(1);
|
||||
return(1);
|
||||
}
|
||||
|
||||
/*
|
||||
init_io:
|
||||
called by postgres before any actual parsing is done
|
||||
called by postgres before any actual parsing is done
|
||||
*/
|
||||
void
|
||||
init_io()
|
||||
{
|
||||
/* it's important to set this to NULL
|
||||
because input()/myinput() checks the non-nullness of parseCh
|
||||
to know when to pass the string to lex/flex */
|
||||
parseCh = NULL;
|
||||
/* it's important to set this to NULL
|
||||
because input()/myinput() checks the non-nullness of parseCh
|
||||
to know when to pass the string to lex/flex */
|
||||
parseCh = NULL;
|
||||
#if defined(FLEX_SCANNER)
|
||||
if (YY_CURRENT_BUFFER)
|
||||
yy_flush_buffer(YY_CURRENT_BUFFER);
|
||||
if (YY_CURRENT_BUFFER)
|
||||
yy_flush_buffer(YY_CURRENT_BUFFER);
|
||||
#endif /* FLEX_SCANNER */
|
||||
BEGIN INITIAL;
|
||||
BEGIN INITIAL;
|
||||
}
|
||||
|
||||
|
||||
|
@ -274,63 +274,63 @@ init_io()
|
|||
int
|
||||
input()
|
||||
{
|
||||
if (parseCh == NULL) {
|
||||
parseCh = parseString;
|
||||
return(*parseCh++);
|
||||
} else if (*parseCh == '\0') {
|
||||
return(0);
|
||||
} else {
|
||||
return(*parseCh++);
|
||||
}
|
||||
if (parseCh == NULL)
|
||||
{
|
||||
parseCh = parseString;
|
||||
return(*parseCh++);
|
||||
}
|
||||
else if (*parseCh == '\0')
|
||||
return(0);
|
||||
else
|
||||
return(*parseCh++);
|
||||
}
|
||||
|
||||
/* undo lex input from a string instead of from stdin */
|
||||
void
|
||||
unput(char c)
|
||||
{
|
||||
if (parseCh == NULL) {
|
||||
elog(FATAL, "Unput() failed.\n");
|
||||
} else if (c != 0) {
|
||||
*--parseCh = c;
|
||||
}
|
||||
if (parseCh == NULL)
|
||||
elog(FATAL, "Unput() failed.\n");
|
||||
else if (c != 0)
|
||||
*--parseCh = c;
|
||||
}
|
||||
|
||||
int
|
||||
CurScanPosition(void)
|
||||
{
|
||||
return (parseCh - parseString - yyleng);
|
||||
return (parseCh - parseString - yyleng);
|
||||
}
|
||||
#endif /* !defined(FLEX_SCANNER) */
|
||||
|
||||
#ifdef FLEX_SCANNER
|
||||
/* input routine for flex to read input from a string instead of a file */
|
||||
int
|
||||
int
|
||||
myinput(char* buf, int max)
|
||||
{
|
||||
int len, copylen;
|
||||
int len, copylen;
|
||||
|
||||
if (parseCh == NULL) {
|
||||
len = strlen(parseString);
|
||||
if (len >= max)
|
||||
copylen = max - 1;
|
||||
if (parseCh == NULL)
|
||||
{
|
||||
len = strlen(parseString);
|
||||
if (len >= max)
|
||||
copylen = max - 1;
|
||||
else
|
||||
copylen = len;
|
||||
if (copylen > 0)
|
||||
memcpy(buf, parseString, copylen);
|
||||
buf[copylen] = '\0';
|
||||
parseCh = parseString;
|
||||
return copylen;
|
||||
}
|
||||
else
|
||||
copylen = len;
|
||||
if (copylen > 0)
|
||||
memcpy(buf, parseString, copylen);
|
||||
buf[copylen] = '\0';
|
||||
parseCh = parseString;
|
||||
return copylen;
|
||||
} else {
|
||||
return 0; /* end of string */
|
||||
}
|
||||
return 0; /* end of string */
|
||||
}
|
||||
|
||||
int
|
||||
CurScanPosition(void)
|
||||
{
|
||||
printf( "current position is %d\n", yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
|
||||
|
||||
return (yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
|
||||
printf( "current position is %d\n", yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
|
||||
return (yy_c_buf_p - yy_current_buffer->yy_ch_buf - yyleng);
|
||||
}
|
||||
|
||||
#endif /* FLEX_SCANNER */
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
%{
|
||||
/*
|
||||
This should work, but non-patched flex 2.5.3 fails because input()
|
||||
doesn't return EOF or '\0'
|
||||
Bruce Momjian <root@candle.pha.pa.us>
|
||||
This should work, but non-patched flex 2.5.3 fails because input()
|
||||
doesn't return EOF or '\0'
|
||||
Bruce Momjian <root@candle.pha.pa.us>
|
||||
*/
|
||||
%}
|
||||
%%
|
||||
|
|
Loading…
Reference in New Issue