[comp.databases] YACC for SQL the code.

lcain@cucstud.UUCP (Leroy Cain) (06/02/88)

	This is my old work.  It has just about every thing you would
want.  It is know to work on several versions of Unix, MS-DOS, and CTOS.
Note that most YACCs will give an error to many terminals or something
like that.  If this happens and you have source for YACC change the
number for NTERMS to 255.  If you do not have source and want to use
it I could send the result from a YACC on my system.
	There are somethings that could be add to it to make it even
more monsterus like leveled transaction handling.  

example:

begin
	begin
	end
	begin
		begin
		end
	end
end

or statement groups so that you could tell the optimizer which statements go
together for better optimization.  Both of these ideas came later and have
not been adequately explored.

-----------
MS-DOS Just say NO!!!!!				Death to MS-DOS
Leroy Cain;      Columbia Union College;      Mathematical Sciences Department
7600 Flower Ave. WH406;  	              Takoma Park, Md 20912
(301) 891-4172				      netsys!cucstud!lcain

-----Cut Here-----Cut Here-----Cut Here-----Cut Here-----
#!/bin/sh
# shar:	Shell Archiver
#	Run the following text with /bin/sh to create:
#	Makefile
#	README
#	ddf.h
#	dsl.l
#	dsl.y
#	ed0
#	ed1
#	ed2
#	gtok.h
#	parser.c
#	parser.h
#	phm.c
#	rwsearch.c
#	tmprws.h
#	tpar.c
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > Makefile
X# Makefile for Data sublanguages
X# written 1985 by Leroy Cain
X
XALL: phm tpar
X
Xphm: phm.c
X	cc -o phm phm.c
X
Xtpar : tpar.o parser.o y.tab.o
X	cc -o tpar tpar.o parser.o y.tab.o -ly -ll
X	
Xtpar.o : tpar.c
X	cc -c tpar.c
X
Xparser.o: parser.c
X	cc -c parser.c
X
Xy.tab.o: y.tab.c lex.yy.c tmprws.h gtok.h
X	./ed1
X	sort +2 -3 y.h| ./phm
X	./ed2 `wc y.h`
X	cc -c y.tab.c
X
Xy.tab.c:dsl.y
X	lyacc -vd dsl.y
X
Xlex.yy.c: dsl.l
X	lex dsl.l
X	./ed0
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > README
XThis directory contains the parser for DDF.  The componets are as follows
X
XMakefile
X
XPROGRAM FILES
Xdsl.l           Lex for parser
Xdsl.y           Yacc for parser
Xdsltype.y
Xparser.c        Main parser function
Xrwsearch.c      Resevered word table search functions
Xtpar.c  -- Main for testing parser
X
XINCLUDE FILES
Xparser.h        parser related tables, defines and variables
Xddf.h
Xgtok.h  -- Parser tree token definitions
Xtmppar.h -- temporary file generated 
X
Xed0     -- edit script for lex
Xed1     -- edit script for yacc
Xed2     -- edit script for yacc
Xrnums   -- tempfile
Xrwords  -- tempfile
X
Xpt_file -- parse tree test output file
Xtestpar -- test program script
Xtpar    -- main test program
Xvtest2  -- test sql
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > ddf.h
Xtypedef struct sql_run
X{
X        unsigned char   *par_buf;
X        int     buf_len;
X} DDFRUN;
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > dsl.l
X/*
XDistributed data base Facilitator
XParser
XVersion 1.0
XCopyright 1986 Columbia Union College
XBy Leroy G. Cain
X*/
X%{
X#include "parser.h"
X#include "rwsearch.c"
X%}
XD       [0-9]
XE       [Ee][-+]?{D}+
X%%
X[a-zA-Z]+   
X{
Xint     rw;
X
X        if((rw= rwsearch(yytext)) == IDENTIFIER )
X        {
X                yylval.nsbuf = strcpy(scratch,yytext);
X        }
X                return rw;
X}
X
X"$"[a-zA-Z_][a-zA-Z0-9_#@]* return( PARM );
X
X[a-zA-Z_][a-zA-Z0-9_#@]* return IDENTIFIER ;
X
X\"[^\"]*        |
X\'[^\']*        
X{
X        if(yytext[yyleng-1] ==  '\\')
X                yymore();
X        else
X        {
X                yytext[yyleng++] = input();
X                yytext[yyleng] = '\0';
X                return( STRING );
X        }
X}
X
X{D}+    return ( INTEGER );
X
X{D}+"."{D}*({E})?       |
X{D}+"."{D}+({E})?       |
X{D}+{E} return ( REAL );
X
X":"     return ':' ;
X";"     return ';' ;
X".*"    return ALLFIELDS ;
X"."     return '.' ;
X","     return ',' ;
X"!"     return NOT ;
X"!="    return NE ;
X"<="    return LE ;
X">="    return GE ;
X"<"     return LT ;
X"!<"    return NLT ;
X">"     return GT ;
X"!>"    return NGT ;
X"("     return '(' ;
X")"     return ')' ;
X">>"    return RIGHTSHIFT ;
X"<<"    return LEFTSHIFT ;
X"|"     return '|' ; /* Bit or */
X"||"    return E_OR ; /* or */
X"^"     return '^' ; /* Bit ex-or */
X"&"     return '&' ; /* Bit and */
X"&&"    return E_AND ; /* and */
X"~"     return '~' ; /* Ones compliment */
X"`"     return '`' ; /* Sematic control */
X"]"     return ']' ;
X"["     return '[' ;
X"="     return EQ ;
X"+"     return '+' ;
X"-"     return '-' ;
X"*"     return '*' ;
X"**"    return PWR ;
X"/"     return '/' ;
X"%"     return '%' ; /* Modulus */
X"?"     return '?' ;
X[/] return( ILLEGAL );
X[ \n\t\r] ;
X%%
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > dsl.y
X/*
XDistributed Database Facilitator Parcer
XVersion 1.0
XBy Leroy G. Cain
X1985 Columbia Union College
X*/
X%union
X{
X        int     stype;
X        char    *nsbuf;
X}
X%token ADD
X%token ALL
X%token ALLOWED
X%token AFTER
X%token ALTER
X%token AND
X%token ANY
X%token AS
X%token ASC
X%token AT
X%token AUDIT
X%token BEFORE
X%token BBEGIN
X%token BETWEEN
X%token BY
X%token CHECK
X%token CLOSE
X%token COMMENT
X%token COMMIT
X%token COMPOSITE
X%token CONSTRAINT
X%token CREATE
X%token DATABASE
X%token DEFAULT
X%token DELETE
X%token DESC
X%token DISTINCT
X%token DIVIDEBY
X%token DOMAIN
X%token DROP
X%token DUMP
X%token END
X%token ELSE
X%token EXISTS
X%token FOR
X%token FOREIGN
X%token FRAGMENT
X%token FROM
X%token GRANT
X%token GROUP
X%token HAVING
X%token IDENTIFIES
X%token IF
X%token IN
X%token INDEX
X%token INFO
X%token INSERT
X%token INTO
X%token INTERSECT
X%token IS
X%token LIKE
X%token LOCK
X%token MINUS
X%token MODE
X%token MODIFY
X%token NOT
X%token NULLN
X%token NULLS
X%token OF
X%token ON
X%token OPEN 
X%token OPTION 
X%token OR
X%token ORDER 
X%token OUTER 
X%token PRIMARY 
X%token PROGRAM 
X%token RANGE
X%token REPAIR
X%token RESTORE
X%token REVOKE 
X%token ROLLBACK 
X%token ROLLFORWARD 
X%token SELECT
X%token SET
X%token SHOW
X%token SNAPSHOT
X%token START
X%token STORE
X%token SYNC
X%token SYNONYM
X%token TABLE
X%token THEN
X%token TO
X%token TYPE
X%token VALUES
X%token VIEW
X%token UNION
X%token UNIQUE
X%token UPDATE
X%token WHERE
X%token WORK
X%token WITH
X/*
X*/
X%token ALLFIELDS
X%token <nsbuf> IDENTIFIER
X%token INTEGER
X%token ILLEGAL
X%token REAL 
X%token STRING
X%token PARM 
X%left ';'
X%left WHERE
X%left OR
X%left AND
X%left ','
X%right ASSIGN
X%right TCOL
X%left '?'
X%left E_OR
X%left E_AND
X%left '|'
X%left '^'
X%left '&'
X%left NLT NGT LT GT EQ GE LE NE
X%left RIGHTSHIFT LEFTSHIFT
X%left '+' '-'
X%left '*' '/' '%' PWR
X%right UMINUS  '~' PNOT
X%left PORDER
X%left '`'
X%left '.'
X
X
X%{
Xstatic long     flag;
Xstatic short    sqy_flag;
X
Xstatic char     path_name[1024];
Xstatic char     scratch[1024];
X
X#include "gtok.h"
X#define BEXPR {sqy_flag=0;}
X%}
X%%
Xdsl:
X          statement ';' 
X          {puttok(T_ROOT);puttok(0);puttok(0);puttok(T_ENDCOMMAND);}
X        | STORE PROGRAM prog_name '(' parm_list ')'stats ';' END STORE ';'
X        ;
X
Xstats:
X        statement
X        | stats ';' statement
X        ;
X
X        /*
Xtrigger_list:
X        trigger
X        | trigger_list ',' trigger
X        |error
X        | trigger_list error trigger
X        | trigger_list ',' error 
X        ;
X        */
Xstatement:
X          { puttok(0300);} alter        
X        | { puttok(0301);} audit
X        | { puttok(0302);} begin
X        | { puttok(0303);} check
X        | { puttok(0304);} close
X        | { puttok(0305);} comment
X        | { puttok(0306);} commit
X        | { puttok(0307);} create
X        | { puttok(0310);} delete
X        | { puttok(0311);} drop
X        | { puttok(0312);} dump
X        | { puttok(0313);} grant
X        | { puttok(0314);} info
X        | { puttok(0315);} insert
X        | { puttok(0316);} lock
X        | { puttok(0317);} open
X        | { puttok(0320);} rollback
X        | { puttok(0321);} rollforward
X        | { puttok(0322);} repair
X        | { puttok(0323);} restore
X        | { puttok(0324);} revoke
X        | { puttok(0325);} select
X        | { puttok(0326);} set
X        | { puttok(0327);} start
X        | { puttok(0330);} sync
X        | { puttok(0331);} update
X        ;
X
Xstart:
X          prog_name '(' expr_list ')'
X          /*
X        | START INTEGER '(' parm_list ')'
X          */
X        ;
X
Xparm_list:
X          parm
X        | parm ',' parm_list
X        ;
X
Xparm:
X          parm_name
X        | parm_name EQ expr %prec ASSIGN
X        ;
X
X/*
XData Manipulation
X*/
X
Xdelete:
X          DELETE FROM rec_alias where_clause /* Set where flag */
X        ;
X
Xinsert:
X            INSERT INTO rec_alias '(' field_list ')' icond
X          | INSERT INTO rec_alias icond
X          ;
X
Xupdate:
X          UPDATE rec_alias set_show where_clause /* Set where flag */
X        ;
X
Xrec_alias:
X          path
X        | path alias
X        ;
X
Xicond:  
X          FROM filename
X        | select_statement
X        | VALUES '(' const_list ')'
X        ;
X
Xset_show:
X          SHOW setelements
X        | SET setelements
X        ;
X
Xsetelements:
X          setelement
X        | setelements ',' setelement
X        ;
X
Xsetelement: 
X          field EQ expr %prec ASSIGN
X        | field EQ select_statement %prec ASSIGN
X        | '[' field_list ']' EQ '[' expr_list ']' %prec ASSIGN
X        | '[' field_list ']' EQ select_statement %prec ASSIGN
X        ;
X
X/*
XQuery Langauge
X*/
X
Xselect:
X        select_expr order_clause into_clause
X        ;
X
Xselect_expr:
X          select_statement
X        | select_expr UNION any select_statement 
X        | select_expr MINUS select_statement 
X        | select_expr DIVIDEBY select_statement 
X        | select_expr INTERSECT select_statement 
X        | '(' select_expr ')'
X        ;
X
Xorder_clause:
X        | ORDER BY norder_list
X        ;
X
Xinto_clause:
X        | INTO filename
X        ;
X
Xselect_statement:
X        { puttok(T_TLEND); }
X          select_clause
X                FROM from_item_list
X                select_options
X        { puttok(T_QLEND); }
X        ;
X
Xorder_list:
X          path orderdir %prec PORDER
X        | order_list ',' path orderdir
X        ;
X
Xnorder_list:
X/*
X          INTEGER orderdir %prec PORDER
X*/
X          expr orderdir %prec PORDER
X/*
X        | path orderdir %prec PORDER
X*/
X        | norder_list ',' norder_list
X        ;
X
Xselect_clause:
X          SELECT unique sellist
X        | SELECT unique '*'
X        ;
X
Xfrom_item_list:
X          from_item
X        | from_item_list ',' from_item_list
X        ;
X
Xfrom_item:
X          rec_alias
X        | OUTER rec_alias
X        | OUTER '(' from_item_list ')'
X        ;
X
Xselect_options:
X        | WHERE predicate /* Set where flag */
X        | WHERE predicate group_clause
X        | group_clause
X        ;
X
Xgroup_clause:
X          GROUP BY path_list
X        | GROUP BY path_list HAVING predicate /* Set having flag */
X        ;
X
Xunique:
X        | ALL
X        | DISTINCT
X        | UNIQUE
X        ;
X
Xsellist:
X          selelement {puttok(T_RESDOM);}
X        | sellist ',' selelement {puttok(T_RESDOM);}
X        ;
X
Xselelement:
X          record ALLFIELDS
X        | expr
X        | expr STRING
X        ;
X
Xpredicate:
X          condition
X        | condition AND predicate 
X        | condition OR predicate 
X        | NOT predicate %prec PNOT
X        | '(' predicate ')'
X        | IF predicate THEN predicate else_pred
X        ;
X
Xelse_pred:
X        |ELSE predicate
X        ;
X
Xcondition:
X           expr
X        |  expr not IN in_sel_expr /* singler flag */
X        | '[' path_list ']'  not IN in_sel_expr
X        |  expr IS not NULLN
X        |  expr IS not DEFAULT
X        |  expr not BETWEEN expr AND expr
X        |  expr not LIKE const  /* Like flag */
X        | EXISTS '(' select_statement ')'
X        ;
X
Xnot:
X        |NOT
X        ;
X
Xany:
X        |ALL
X        |ANY
X        ;
X
Xin_sel_expr:
X          '(' select_statement ')' 
X        | const_recs
X        ;
X
Xcond_sel_expr:
X          expr
X        | '(' select_statement ')' 
X        {if(sqy_flag==1) yyerror("Illegel subquery"); else sqy_flag=1;}
X        ;
X
Xconst_recs:
X          '(' const_list ')'
X        | '[' const_rec_list ']'
X        ;
X
Xconst_rec_list:
X          '(' const_list ')'
X        | const_rec_list ',' '(' const_list ')'
X        ;
X
Xpath_list:
X          path
X        | path_list ',' path
X        ;
X
Xfield_list:
X          field
X        | field_list ',' field
X        ;
X/*
Xpath is a field or record path.
Xnode.database.record  -- for records
Xnode.database.record.field  -- for fields
X*/
Xpath:
X        path_e_list {puttok(T_VAR);putvar(path_name);*path_name='\0';}
X        | path_e_list '[' element_name ']'
X        ;
X
Xpath_e_list:
X        path_element
X        | path_element  {strcat(path_name,".");} '.' path_e_list
X        ;
X
Xelement_name:/* element_name flag */
X         norder_list
X        ;
X
Xorderdir: 
X        | DESC
X        | ASC
X        ;
X
Xconst_list:
X          const
X        | const_list ',' const
X        ;
X
Xexpr:
X          expr '`' s_control    /* Semantic control */
X        | '-' expr %prec UMINUS {puttok(T_NEG);}/* negate */
X        | expr '+' expr {puttok(T_ADD);}/* add */
X        | expr '-' expr {puttok(T_SUB);}/* subtract */
X        | expr '*' expr {puttok(T_MUL);}/* multiply */
X        | expr '/' expr {puttok(T_DIV);}/* divide */
X        | expr '%' expr {puttok(T_MOD);}/* modulus */
X        | expr PWR expr {puttok(T_ADD);}/* power */
X        | expr '?' else_part
X        | '~' expr      /* ones compliment */
X        | expr RIGHTSHIFT expr /* bit shift right */
X        | expr LEFTSHIFT expr /* bit shift left */
X        | expr '^' expr /* exclusive or */
X        | expr '|' expr /* or */
X        | expr '&' expr /* and */
X        | expr E_OR expr        /* or */
X        | expr E_AND expr       /* and */
X        | expr NLT cond_sel_expr {puttok(T_NLT);}
X        | expr NGT cond_sel_expr {puttok(T_NGT);}
X        | expr LT any cond_sel_expr {puttok(T_LT);}
X        | expr GT any cond_sel_expr {puttok(T_GT);}
X        | expr EQ any cond_sel_expr {puttok(T_EQ);}
X        | expr GE cond_sel_expr {puttok(T_GE);}
X        | expr LE cond_sel_expr {puttok(T_LE);}
X        | expr NE any cond_sel_expr {puttok(T_NE);}
X        | '(' expr ')'  /* parenthesis */
X        | const
X        | path
X        | function
X        ;
X
Xelse_part:
X        expr ':' expr %prec TCOL
X        ;
X
Xconst:
X          INTEGER {puttok(T_INT4); putint(yytext);}
X        | REAL {puttok(T_FLT8); putreal(yytext);}
X        | STRING {puttok(T_CHAR); putstr(yytext);}
X        | DEFAULT
X        | NULLN
X        | PARM
X        ;
X
Xfunction: 
X          fname '(' '*' ')'
X        | fname '(' expr_list ')'
X        | fname '(' UNIQUE path ')'
X        ;
X
Xexpr_list:
X          expr
X        | expr_list ',' expr
X        ;
X
X/*
XData Definition Language
X*/
Xcreate:
X          CREATE cluster TABLE path tfd_list with_clause
X        | CREATE VIEW view_name vfd AS select_statement with_clause
X        | CREATE FRAGMENT view_name vfd AS select_statement with_clause
X        | CREATE SNAPSHOT view_name vfd AS select_statement with_clause
X        | CREATE SYNONYM syn_name FOR path 
X        | CREATE unique cluster INDEX index_name
X                ON path '(' order_list ')' with_clause
X        | CREATE DATABASE dbname TYPE dbtype ON hname with_clause
X        | CREATE DOMAIN domain_name_list IS domain_types
X                defaults domain_restrict
X        | CREATE TYPE type_name IS 
X        | CREATE CONSTRAINT constr_name trigger_list CHECK predicate else_clause
X        ;
X
Xalter:
X          ALTER TABLE path alter_list with_clause
X        | ALTER TABLE path path with_clause
X        ;
X
Xdrop:
X          DROP INDEX index_name
X        | DROP object_type path
X        ;
X
Xcomment:
X          COMMENT ON path
X        | COMMENT ON path IS comment_str
X        ;
X
Xinfo:
X          INFO
X        ;
X
Xcomment_str:
X          STRING
X        | STRING ',' STRING
X        ;
X
Xtrigger_list:
X        trigger
X        | trigger_list ',' trigger
X        ;
X
Xtrigger:
X          AT event
X        | AFTER event OF path FROM path
X        | BEFORE event OF path FROM path
X        ;
X
Xevent:
X          COMMIT
X        | DELETE
X        | INSERT
X        | UPDATE
X        ;
X
Xelse_clause:
X        | ELSE statement
X        ;
X
Xindex_name:     path;
X
Xcluster:
X        | IDENTIFIER
X        /*
X        |CLUSTERED |NONCLUSTERED
X        */
X        ;
X
Xview_name:
X          record
X        | user '.' record
X        ;
X
Xwith_clause:
X        |WITH option_list
X        ;
X
Xoption_list:
X          option
X        | option ',' option_list
X        ;
X
Xoption:
X        IDENTIFIER
X        | IDENTIFIER IDENTIFIER
X        | IDENTIFIER EQ const
X/*
Xreconfigure| check option |logfile = "file_name"
X*/
X        ;
X
Xtfd_list:
X          primary_key
X          foreign_keys
X          field_dis
X        ;
X
Xfield_dis:
X          '(' tfd_fields ')'
X        ;
X
Xprimary_key:
X        | PRIMARY '(' primary_keys ')'
X        ;
X
Xprimary_keys:
X          field
X        | primary_keys ',' field
X        ;
X
Xforeign_keys:
X        | foreign_keys foreign_key
X        ;
X
Xforeign_key:
X          FOREIGN '(' f_key IDENTIFIES path
X                  nulls
X                  DELETE OF path effect
X                  UPDATE OF path effect')'
X        ;
X
X/*
Xf_keys:
X          f_key
X        | f_keys ',' f_key
X        ;
X*/
X
Xnulls:
X          NULLS ALLOWED
X        | NULLS NOT ALLOWED
X        ;
X
Xtfd_fields:
X          tfd
X        | tfd_fields ',' tfd
X        ;
X
Xtfd:
X          field o_domain_name
X        | field '(' field_list ')' o_domain_name
X        ;
X
Xo_domain_name:
X        |domain_name
X        ;
X
Xtype_name:
X        IDENTIFIER
X        /*
XBase types:
X        boolean(bit)|
X        char|short_integer|long_integer|
X        byte|short_word|long_word|
X        float|double|extended|bcd|bcdflt
Xpredefine extentions:
X        char|byte[1-2,000,000,000]
X        [short|long]_[integer|word][1-2,000,000,000]
X        float|double|extended[1-2,000,000,000]
X        bcd|bcdflt[1-2,000,000,000]
X        date_[]
X        money
X        time_[m,ap,sm,sap,micro]
X        */
X        ;
X
Xdomain_name_list:
X        domain_name
X        | domain_name_list ',' domain_name
X        ;
X
Xdomain_types:
X        domain_type
X        | '(' domain_type_list ')'
X        ;
X
Xdefaults:
X        | DEFAULT 
X        ;
X
Xdomain_restrict:
X          where_clause
X        | select_statement
X        ;
X
Xdomain_type_list:
X        | domain_type_list ',' domain_type
X        ;
X
Xdomain_type:
X          type_name
X        | type_name '(' i_list ')'
X        ;
X
Xi_list:
X        INTEGER
X        | i_list ',' INTEGER
X        ;
X
Xvfd:
X        | '(' vfd_list ')' 
X        ;
X
Xvfd_list:
X          field
X        | vfd_list ',' field
X        ;
X
Xalter_list:
X        alteration
X        | alter_list ',' alteration
X        ;
X
Xalteration:
X          ADD '(' a_tfd_fields ')'
X        | DROP vfd
X        | MODIFY '(' m_tfd_fields ')'
X        ;
X
Xa_tfd_fields:
X          tfd before
X        | a_tfd_fields ',' tfd before
X        ;
X
Xm_tfd_fields:
X          field tfd
X        | m_tfd_fields ',' field tfd
X        ;
X
Xbefore:
X        | BEFORE field
X        ;
X
Xeffect:
X        IDENTIFIER
X/*
X        CASCADES | RESTRICTED | NULLIFIES
X*/
X        ;
X/*
X*/
Xobject_type:
X        DATABASE| DOMAIN| PROGRAM| SYNONYM| TYPE| TABLE| VIEW
X        ;
X/*
XSecurity
X*/
X
Xgrant:
X          GRANT privileges gr_on TO users at_option between_option
X                on_option where_option wgo
X        ;
X
Xat_option:
X        |AT terminal_list
X        ;
X
Xbetween_option:
X        |BETWEEN time1 AND time2
X        ;
X
Xon_option:
X        |ON day1 AND day2
X        ;
X
Xwhere_option:
X        |WHERE predicate
X        ;
X
Xwgo:
X        | WITH GRANT OPTION
X        ;
X
Xterminal_list:
X          tty
X        | tty ',' terminal_list
X        ;
X
Xrevoke:
X        REVOKE privileges gr_on FROM users
X        ;
X
Xprivileges:
X        | privileg
X        | privileges ',' privileg
X        ;
X
Xprivileg:
X          priv_name
X        | priv_name '(' field_list ')'
X        ;
X
Xgr_on:
X        | ON object_type objects 
X        ;
X
Xusers:
X        user
X        | users ',' user
X        ;
X
Xobjects:
X          IDENTIFIER
X        | objects ',' IDENTIFIER
X        ;
X
X/*
XTransaction Management
X*/
X
Xlock:
X          LOCK TABLE path IN mode MODE
X        ;
X
Xbegin:
X          BBEGIN work
X        ;
X
Xcommit:
X          COMMIT work
X        ;
X
Xrollback:
X          ROLLBACK work
X        | ROLLBACK SYNC
X        ;
X
Xrollforward:
X          ROLLFORWARD path FROM path roll_op
X        ;
X
Xroll_op:
X        |TO STRING time
X        ;
X
Xtime:
X        |STRING 
X        ;
X
Xsync:
X          SYNC
X        ;
X
Xwork:
X        |WORK
X        ;
X/*
XAcess management
X*/
X
X
Xclose:
X        CLOSE dbname
X        ;
X
Xopen:
X        OPEN dbname password
X        ;
X
X
Xpassword:
X        |IDENTIFIER
X        ;
X/*
XDataBase Maintaince and Configuration
X*/
Xaudit:
X          AUDIT into_clause path_list
X                from_clause where_clause /* Set audit flag */
X        ;
X
Xcheck:
X        CHECK
X        ;
X
Xdump:
X          DUMP DATABASE dbname to_clause
X        | DUMP TABLE dbname to_clause
X        ;
X
Xrepair:
X        REPAIR
X        ;
X
Xrestore:
X          RESTORE DATABASE dbname rfrom_clause
X        | RESTORE TABLE dbname rfrom_clause
X        ;
X
Xto_clause:
X        |TO filename
X        ;
X
Xrfrom_clause:
X        |FROM filename
X        ;
X
Xset:
X        SET option_list
X        ;
X
Xwhere_clause:
X        | WHERE predicate
X        ;
X
Xfrom_clause:
X        | FROM path_list
X        ;
X/*
XCONSTRAND IDENTIFIERS
X*/
Xmode:
X        IDENTIFIER
X/* check
X        SHARE | EXCLUSIVE | OFF
X*/
X        ;
X
Xpriv_name:
X          IDENTIFIER
X        | ALTER | CREATE | DELETE | DUMP | RESTORE 
X        | DROP | INSERT | LOCK | SELECT | UPDATE
X/* check
X        | CREATE_TABLE | CREATE_DATABASE 
X        | CREATE_INDEX | ALL
X*/      ;
X
Xs_control:
X          IDENTIFIER
X          ;
X/*
XIDENTIFIERS
X*/
Xalias:  IDENTIFIER;
Xconstr_name:    IDENTIFIER;/* Constraint Name */
Xday1: IDENTIFIER;
Xday2: IDENTIFIER;
Xdbtype: PARM |  IDENTIFIER;/* Database type */
Xdbname: PARM |  IDENTIFIER;/* Database name */
Xdomain_name:    IDENTIFIER;
Xfield:  IDENTIFIER;
Xfilename:       PARM |  IDENTIFIER; /* File name */
Xfname:  IDENTIFIER;     /* FUNCTION NAME */
Xf_key:  IDENTIFIER;
Xhname:  IDENTIFIER;
Xparm_name:      IDENTIFIER;
X/* Field or Record path element */
Xpath_element:   IDENTIFIER {strcat(path_name,$1);};
Xprog_name:      IDENTIFIER;
Xrecord: IDENTIFIER;
Xsyn_name:       IDENTIFIER;
Xtty:    IDENTIFIER;
Xtime1: IDENTIFIER;
Xtime2: IDENTIFIER;
Xuser:   PARM | IDENTIFIER;
X/*
Xrange_num: IDENTIFIER | INTEGER;
X*/
X%%
X#include "lex.yy.c"
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > ed0
Xed lex.yy.c > ed0.out <<EOF
X/output/
X.,.+2 d
Xw
Xq
XEOF
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > ed1
Xed y.tab.h > ed1.out <<EOF
X/ALLFIELDS/
X.,$ d
X/BBEGIN/
X.s/BBEGIN/BEGIN/
X/NULLN/
X.s/NULLN/NULL/
X1
X/extern/
X1,.d
Xw y.h
Xq
XEOF
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > ed2
Xset -x
Xecho $1>nt
Xed rwords >ed2.out <<EOF
X\$
X. s/, \$//
Xw
Xq
XEOF
Xed rnums >>ed2.out <<EOF
X\$
X. s/, \$//
Xw
Xq
XEOF
Xed tmprws.h >>ed2.out <<EOF
X/RWORDS/
X.s/[0-9][0-9]//
X.r nt
X-
X.,.+1j
X/\~\~/
X. d
X-
X. r rwords
X/\~\~/
X. d
X-
X. r rnums
Xw parser.h
Xq
XEOF
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > gtok.h
X/*
XGenarate tokens for parse tree
XDDF Version 1.00
XBy Leroy G. Cain
XCopywrite 1986
X*/
X
X/* Tokens */
X/* expressions */
X#define T_EQ    0201
X#define T_NE    0202
X#define T_GT    0203
X#define T_NGT   0225
X#define T_GE    0204
X#define T_LT    0205
X#define T_NLT   0226
X#define T_LE    0206
X#define T_AND   0210
X#define T_OR    0211
X#define T_ADD   0212
X#define T_NEG   0101
X#define T_SUB   0213
X#define T_MUL   0214
X#define T_DIV   0215
X#define T_MOD   0221
X
X/* Constaints and varibles */
X#define T_FCHAR 0047
X#define T_PCHAR 0054
X#define T_CHAR  0057
X#define T_VAR   0050
X#define T_INT4  0070
X#define T_FLT8  0074
X
X/* Struct tokens */
X#define T_ROOT  0264
X#define T_ENDCOMMAND    0220
X#define T_AGHEAD        0217
X#define T_RESDOM        0200
X#define T_TLEND 0001
X#define T_QLEND 0002
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > parser.c
X/*
XParser
XVersion 1.0
X1986 Columbia Union College
XBy Leroy G. Cain
X*/
X
X# include "ddf.h"
X# include <stdio.h>
X# define U(x) x
X
Xstatic char     *par_buf;
Xstatic char     *par_sbuf;
X
Xextern char * yysptr, yysbuf[];
Xextern int yytchar;
Xextern int yylineno;
Xextern int ddf_err;
X
Xstatic unsigned char    ptree[4096];
Xstatic unsigned char    *ptree_ptr;
X
Xparse ( ddf_run, str )
XDDFRUN  *ddf_run;
Xchar    *str;
X{
Xregister int    preturn;
Xint     fd;
X
X        par_buf = str;
X        par_sbuf = str;
X        ptree_ptr = ptree;
X        preturn=yyparse();
X        ddf_run->par_buf= ptree;
X        ddf_run->buf_len= ptree_ptr-ptree;
X        return !preturn;
X        /*
X        if( (preturn=ddf_parser()) && type >0 )
X                pcovert(ptree,type);
X        return preturn;
X        */
X}
X
Xinput()
X{
X        return
X        (
X                ( ( yytchar = yysptr >yysbuf ? U(*--yysptr): *par_buf++)
X                == 10 ? (yylineno++, yytchar) : yytchar) == EOF?0:yytchar
X        );
X}
X
Xunput(c)
Xint     c;
X{
X        yytchar = c;
X        if (yytchar=='\n') yylineno--;
X        *yysptr++ = yytchar;
X}
X
Xoutput(c)
Xint     c;
X{
X}
X
Xparerror(err)
Xint     err;
X{
X        ddf_err=err;
X}
X
Xputvar(s)
Xchar    *s;
X{
Xint     x;
X
X        *ptree_ptr++ = strlen(s);
X        for(;*s;*ptree_ptr++ = *s++);
X}
X
Xputstr(s)
Xchar    *s;
X{
Xint     x;
X
X        *ptree_ptr++ = x = strlen(s)-2;
X        *(s+x+1)= '\0';
X        for(s++;*s;*ptree_ptr++ = *s++);
X}
X
Xputtok(n)
Xint     n;
X{
X        *ptree_ptr++ = n;
X}
X
Xputint(s)
Xchar    *s;
X{
Xunion
X{
X        long    num;
X        unsigned char   n[4];
X} cludge;
X
X        cludge.num = atoi(s);
X        *ptree_ptr++ = cludge.n[0];
X        *ptree_ptr++ = cludge.n[1];
X        *ptree_ptr++ = cludge.n[2];
X        *ptree_ptr++ = cludge.n[3];
X}
X
Xputreal(s)
Xchar    *s;
X{
Xunion
X{
X        double  num;
X        unsigned char   n[8];
X} cludge;
X
X        cludge.num = atof(s);
X        *ptree_ptr++ = cludge.n[0];
X        *ptree_ptr++ = cludge.n[1];
X        *ptree_ptr++ = cludge.n[2];
X        *ptree_ptr++ = cludge.n[3];
X        *ptree_ptr++ = cludge.n[4];
X        *ptree_ptr++ = cludge.n[5];
X        *ptree_ptr++ = cludge.n[6];
X        *ptree_ptr++ = cludge.n[7];
X}
X
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > parser.h
X#define RWORDS 93
X#define FTOKEN 257
X
Xchar    *rwords [] =
X{
X"ADD", "AFTER", "ALL", "ALLOWED", "ALTER", "AND",
X"ANY", "AS", "ASC", "AT", "AUDIT", "BEFORE",
X"BEGIN", "BETWEEN", "BY", "CHECK", "CLOSE", "COMMENT",
X"COMMIT", "COMPOSITE", "CONSTRAINT", "CREATE", "DATABASE", "DEFAULT",
X"DELETE", "DESC", "DISTINCT", "DIVIDEBY", "DOMAIN", "DROP",
X"DUMP", "ELSE", "END", "EXISTS", "FOR", "FOREIGN",
X"FRAGMENT", "FROM", "GRANT", "GROUP", "HAVING", "IDENTIFIES",
X"IF", "IN", "INDEX", "INFO", "INSERT", "INTERSECT",
X"INTO", "IS", "LIKE", "LOCK", "MINUS", "MODE",
X"MODIFY", "NOT", "NULL", "NULLS", "OF", "ON",
X"OPEN", "OPTION", "OR", "ORDER", "OUTER", "PRIMARY",
X"PROGRAM", "RANGE", "REPAIR", "RESTORE", "REVOKE", "ROLLBACK",
X"ROLLFORWARD", "SELECT", "SET", "SHOW", "SNAPSHOT", "START",
X"STORE", "SYNC", "SYNONYM", "TABLE", "THEN", "TO",
X"TYPE", "UNION", "UNIQUE", "UPDATE", "VALUES", "VIEW",
X"WHERE", "WITH", "WORK"
X};
X
Xint     rnums [] =
X{
X257, 260, 258, 259, 261, 262,
X263, 264, 265, 266, 267, 268,
X269, 270, 271, 272, 273, 274,
X275, 276, 277, 278, 279, 280,
X281, 282, 283, 284, 285, 286,
X287, 289, 288, 290, 291, 292,
X293, 294, 295, 296, 297, 298,
X299, 300, 301, 302, 303, 305,
X304, 306, 307, 308, 309, 310,
X311, 312, 313, 314, 315, 316,
X317, 318, 319, 320, 321, 322,
X323, 324, 325, 326, 327, 328,
X329, 330, 331, 332, 333, 334,
X335, 336, 337, 338, 339, 340,
X341, 344, 345, 346, 342, 343,
X347, 349, 348
X};
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > phm.c
X#include <stdio.h>
X
Xmain()
X{
Xchar	st[256];
Xchar	j0, j1[32];
Xchar	token[32];
Xint	num;
Xint	n=0;
XFILE	*words;
XFILE	*nums;
X
X	words=fopen("rwords","w");
X	nums=fopen("rnums","w");
X	while ( gets(st)!=NULL)
X	{
X		sscanf(st,"%c %s %s %d ",&j0,j1,token,&num);
X		fprintf(words,"\"%s\"%s",token,(n==5)? ",\n": ", ");
X		fprintf(nums,"%d%s",num,(n==5)? ",\n": ", ");
X		n=(n==5) ? 0 : ++n;
X	}
X	fprintf(words,"\n");
X	fprintf(nums,"\n");
X	exit(0);
X}
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > rwsearch.c
X# include <ctype.h>
Xrwsearch( str )
Xchar    *str;
X{
Xint     x;
Xint     mid;
Xint     low=0;
Xint     high=RWORDS - 1;
X
X        upshift(str);
X        while(low <= high)
X        {
X                mid = (low+high)/2;
X                if( !(x=strcmp(str, rwords[mid])) )
X                        return(rnums[mid]);
X                else if( x<0 ) /* if lesser */
X                        high = mid-1;
X                else if( x>0 ) /* if greater */
X                        low = mid+1;
X        }
X        return(IDENTIFIER);
X}
X
Xupshift(str)
Xchar    *str;
X{
X        for(;*str;str++)
X                *str = (isupper(*str))? *str : toupper(*str);
X}
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > tmprws.h
X#define RWORDS 71
X#define FTOKEN 257
X
Xchar    *rwords [] =
X{
X~~
X};
X
Xint     rnums [] =
X{
X~~
X};
SHAR_EOF
echo x - extracting shar
sed 's/^X//' << 'SHAR_EOF' > tpar.c
X#include <ctype.h>
X#include <stdio.h>
X#include "ddf.h"
X
Xint     ddf_err;
X
Xmain(argc,argv)
Xint     argc;
Xchar    *argv[];
X{
Xint     x=0;
XFILE    *fd;
Xchar    s[1024];
XDDFRUN  partree;
X
X        fd= fopen("pt_file","w");
X        for(printf("%d>>",x++) ;getqu(s) &&  parse(&partree,s)>0;x++)
X        {
X                fwrite(partree.par_buf,partree.buf_len,1,fd);
X                printf("%d>>",x);
X        }
X}
X
Xgetq(s)
Xchar    *s;
X{
X        for(; (*s=getchar()) != EOF && *s != ';' ; s++);
X        if(*s == EOF )
X                return 0;
X        else
X        {
X                *++s = '\0';
X                return 1;
X        }
X}
X
Xgetqu(s)
Xchar    *s;
X{
Xstatic int      getqtab[3] [5] =
X{
X{0,1,0,(int)'e',0},
X{1,1,2,1,1},
X{2,0,1,1,1}
X};
Xint     tk;
Xint     st=0;
X
X        *s='\0';
X        while((tk=getqt(s)) !=EOF)
X        {
X                if(tk== 3 &&  !st)
X                {
X                        return 1;
X                }
X                else
X                        st = getqtab[st] [tk];
X        }
X        return 0;
X}
X
Xgetqt(s)
Xchar    *s;
X{
Xint     c;
Xint     value;
Xchar    buf[256];
Xchar    *sbuf=buf;
X
X        if(isspace( (c=getchar()) ))
X                value=0;
X        else if( isalpha(c))
X        {
X                for(*buf=(islower(c)) ?toupper(c):c; isalpha( (c=getchar()) ) &&
X                        c != EOF ; *++sbuf = (islower(c)) ?toupper(c):c);
X                *++sbuf ='\0';
X                if(!strcmp(buf,"END"))
X                        value=2;
X                else if(!strcmp(buf,"STORE"))
X                        value=1;
X                else
X                        value=4;
X                ungetc(c,stdin);
X                strcat(s,buf);
X                return value;
X        }
X        else if(c==';')
X                value=3;
X        else if(c == EOF)
X                value = EOF;
X        else
X                value= 4;
X        *sbuf = c;
X        *++sbuf ='\0';
X        strcat(s,buf);
X        return value;
X}
SHAR_EOF
exit

lcain@cucstud.UUCP (Leroy Cain) (06/06/88)

In article <11799@mimsy.UUCP>, timos@mykines (Timos Sellis) writes:
> There is a small problem in Leroy's code. At least when I tried
> to use it in our machines (SUN 3's, VAX). To make it work change
> the number 100 in the RWORDS entry in file rws.h to 99, that is
> the line should be
> 	#define RWORDS 99
> 
> With that change the programs compile and work very well!
> 
> Thanks Leroy!

Thanks for pointing that out I thought it might be something like that.
The problem springs from the fact that I am using a binary search, you
can see why getting the wrong number would cause problems.  As I remember
I kept messing myself up every time I added a new reserved word.  The
version I distributed to the net relies on tmprws.h and seems to work.

Another problem comes form rerunning the ed? script.  If you have problems,
clear everything up and do a make from scatch.  I have switch to sed script
on my current work, and am getting better results.

-------------
MS-DOS Just say NO!!!!!			      OS/2 Why??????
Leroy Cain;      Columbia Union College;      Mathematical Sciences Department
7600 Flower Ave. WH406;  	              Takoma Park, Md 20912
(301) 891-4172				      netsys!cucstud!lcain