ING_DB
This commit is contained in:
parent
4f64c97b71
commit
074dc76d34
|
|
@ -0,0 +1,539 @@
|
|||
/* KEY WORDS */
|
||||
%term APPEND CLOSE COMMIT COUNT DELETE DBS EXIT
|
||||
%term GET GOTO INSERT LENGTH OPEN OVER PERMIT
|
||||
%term PRINT REPLACE SCAN USE USER
|
||||
|
||||
/* LOCKING */ /*PL*/
|
||||
%term ABORT IF DEADLK LEVEL MAXLK READLK RL_PG /*PL*/
|
||||
%term TIMEOUT WITH /*PL*/
|
||||
|
||||
/* SEPERATE COMPILING */ /*SC*/
|
||||
%term EXPORT IMPORT /*SC*/
|
||||
|
||||
/* C VAR */
|
||||
%term ALLOC TYPE
|
||||
|
||||
/* PUNCTUATION */
|
||||
%term BGNCMNT COMMA DOM ENDCMNT LBRACE LBRKT LPAREN
|
||||
%term MINUS PLUS RBRACE RBRKT RPAREN SEMICOL STAR
|
||||
|
||||
/* BOUNDS OPERATORS */
|
||||
%term BDOP IS
|
||||
|
||||
/* CONSTANTS */
|
||||
%term ICONST LCONST NAME RCONST SCONST
|
||||
|
||||
%{
|
||||
# include "amx.h"
|
||||
%}
|
||||
|
||||
%%
|
||||
|
||||
%{
|
||||
extern char *name_lookup();
|
||||
extern char *scan();
|
||||
extern int write();
|
||||
%}
|
||||
|
||||
program: dbs stmt_list
|
||||
= {
|
||||
amx();
|
||||
}
|
||||
| expimp /*SC*/
|
||||
= { /*SC*/
|
||||
amx(); /*SC*/
|
||||
} /*SC*/
|
||||
;
|
||||
dbs: DBS uflag bflag name
|
||||
= {
|
||||
if ($1 != (char *) M_SHARE)
|
||||
{
|
||||
clrbit(DB_SHARE, Xlocks);
|
||||
No_locks++;
|
||||
}
|
||||
tmp($4, $2);
|
||||
}
|
||||
| import expimp /*SC*/
|
||||
;
|
||||
expimp: export dbs db_var_list LPAREN rel_list RPAREN /*SC*/
|
||||
; /*SC*/
|
||||
export: EXPORT /*SC*/
|
||||
= { /*SC*/
|
||||
if (!ExpImp) /*SC*/
|
||||
ExpImp = 1; /*SC*/
|
||||
} /*SC*/
|
||||
import: IMPORT SCONST /*SC*/
|
||||
= { /*SC*/
|
||||
import($2); /*SC*/
|
||||
} /*SC*/
|
||||
; /*SC*/
|
||||
rel_list: rel_list COMMA rel /*SC*/
|
||||
| rel /*SC*/
|
||||
; /*SC*/
|
||||
db_var_list: EXPORT var_list /*SC*/
|
||||
| /* empty */ /*SC*/
|
||||
; /*SC*/
|
||||
var_list: var_list db_var /*SC*/
|
||||
| db_var /*SC*/
|
||||
; /*SC*/
|
||||
db_var: db_specifier decl_list SEMICOL /*SC*/
|
||||
= { /*SC*/
|
||||
fprintf(FILE_tmp, ";\n"); /*SC*/
|
||||
Type_spec = opINT; /*SC*/
|
||||
} /*SC*/
|
||||
; /*SC*/
|
||||
db_specifier: TYPE /*SC*/
|
||||
= { /*SC*/
|
||||
if (ExpImp < 0) /*SC*/
|
||||
fprintf(FILE_tmp, "extern "); /*SC*/
|
||||
fprintf(FILE_tmp, "%s\t", TYPE_SPEC[(int) $1]); /*SC*/
|
||||
Type_spec = (int) $1; /*SC*/
|
||||
} /*SC*/
|
||||
; /*SC*/
|
||||
uflag: MINUS NAME
|
||||
= {
|
||||
if (*((char *) $2) != 'u')
|
||||
{
|
||||
amxerror(106, $2);
|
||||
$$ = (char *) 0;
|
||||
}
|
||||
else if (AAlength($2) > MAXNAME + 1)
|
||||
{
|
||||
amxerror(108, $2);
|
||||
$$ = (char *) 0;
|
||||
}
|
||||
else
|
||||
$$ = $2;
|
||||
}
|
||||
| /* empty */
|
||||
= {
|
||||
$$ = (char *) 0;
|
||||
}
|
||||
;
|
||||
bflag: PLUS ICONST
|
||||
= {
|
||||
Xbufs = (int) $2;
|
||||
}
|
||||
| /* empty */
|
||||
;
|
||||
name: NAME
|
||||
= {
|
||||
$$ = name_lookup($1);
|
||||
}
|
||||
;
|
||||
stmt_list: stmt_list stmt
|
||||
| stmt
|
||||
;
|
||||
stmt: declaration
|
||||
| OPEN rel
|
||||
= {
|
||||
w_open();
|
||||
}
|
||||
| CLOSE rel
|
||||
= {
|
||||
w_close();
|
||||
}
|
||||
| USE LPAREN use_list RPAREN
|
||||
= {
|
||||
w_use(M_TE);
|
||||
}
|
||||
| COMMIT
|
||||
= {
|
||||
w_commit();
|
||||
}
|
||||
| append LPAREN dom_assign RPAREN
|
||||
= {
|
||||
end_append();
|
||||
}
|
||||
| get var_assign LBRACE scan_list RBRACE
|
||||
= {
|
||||
end_scan($1, 0);
|
||||
}
|
||||
| retrieve var_assign LBRACE scan_list RBRACE
|
||||
= {
|
||||
end_scan($1, 1);
|
||||
}
|
||||
| GOTO
|
||||
= {
|
||||
scan_goto((int) $1);
|
||||
}
|
||||
| DELETE
|
||||
= {
|
||||
delete();
|
||||
}
|
||||
| replace LPAREN dom_assign RPAREN
|
||||
= {
|
||||
end_replace();
|
||||
}
|
||||
| print LPAREN dom_list RPAREN
|
||||
= {
|
||||
fprintf(FILE_tmp, msg(209));
|
||||
}
|
||||
| COUNT rel c_var
|
||||
= {
|
||||
if (Destination.type == opSTRING)
|
||||
amxerror(110, Destination.c_var);
|
||||
else
|
||||
fprintf(FILE_tmp, msg(62),
|
||||
Destination.c_var, Relation->rel_uniq);
|
||||
}
|
||||
| LENGTH rel c_var
|
||||
= {
|
||||
if (Destination.type == opSTRING)
|
||||
amxerror(197, Destination.c_var);
|
||||
else
|
||||
fprintf(FILE_tmp, msg(157),
|
||||
Destination.c_var, Relation->rel_uniq);
|
||||
}
|
||||
| PERMIT USER
|
||||
= {
|
||||
fprintf(FILE_tmp, msg(60 + (int) $2));
|
||||
}
|
||||
| SEMICOL /* no operation */
|
||||
| ABORT /*PL*/
|
||||
= { /*PL*/
|
||||
w_abort(); /*PL*/
|
||||
} /*PL*/
|
||||
| deadlock LBRACE stmt_list RBRACE /*PL*/
|
||||
= { /*PL*/
|
||||
fprintf(FILE_tmp, msg(209)); /*PL*/
|
||||
} /*PL*/
|
||||
| EXIT
|
||||
= {
|
||||
if (Scan_rel)
|
||||
amxerror(212);
|
||||
else
|
||||
fprintf(FILE_tmp, msg(211));
|
||||
}
|
||||
| error
|
||||
;
|
||||
rel: name
|
||||
= {
|
||||
rel_lookup($1, 0);
|
||||
}
|
||||
;
|
||||
use_list: use_list COMMA use_rel
|
||||
= {
|
||||
w_use(Lock_mode);
|
||||
}
|
||||
| use_rel
|
||||
= {
|
||||
w_use(-Lock_mode);
|
||||
}
|
||||
;
|
||||
use_rel: use_mode rel
|
||||
use_with /*PL*/
|
||||
;
|
||||
use_mode: DBS
|
||||
= {
|
||||
if (!$1)
|
||||
Lock_mode = M_EXCL;
|
||||
else
|
||||
Lock_mode = (int) $1;
|
||||
}
|
||||
| PLUS
|
||||
= {
|
||||
Lock_mode = M_EXCL;
|
||||
}
|
||||
| /* empty */
|
||||
= {
|
||||
Lock_mode = M_SHARE;
|
||||
}
|
||||
;
|
||||
use_with: WITH level readlock maxlocks timeout /*PL*/
|
||||
= { /*PL*/
|
||||
if (!Dead_lock) /*PL*/
|
||||
goto std_lock; /*PL*/
|
||||
} /*PL*/
|
||||
| /* empty */ /*PL*/
|
||||
= { /*PL*/
|
||||
std_lock: /*PL*/
|
||||
Lock_level = M_REL; /*PL*/
|
||||
Read_lock = 0; /*PL*/
|
||||
Max_locks = -1; /*PL*/
|
||||
Time_out = -1; /*PL*/
|
||||
} /*PL*/
|
||||
; /*PL*/
|
||||
level: LEVEL IS RL_PG /*PL*/
|
||||
= { /*PL*/
|
||||
Lock_level = (int) $3; /*PL*/
|
||||
} /*PL*/
|
||||
| /* empty */ /*PL*/
|
||||
= { /*PL*/
|
||||
Lock_level = M_REL; /*PL*/
|
||||
} /*PL*/
|
||||
; /*PL*/
|
||||
readlock: READLK IS DBS /*PL*/
|
||||
= { /*PL*/
|
||||
Read_lock = (int) $3; /*PL*/
|
||||
} /*PL*/
|
||||
| /* empty */ /*PL*/
|
||||
= { /*PL*/
|
||||
Read_lock = 0; /*PL*/
|
||||
} /*PL*/
|
||||
; /*PL*/
|
||||
maxlocks: MAXLK IS ICONST /*PL*/
|
||||
= { /*PL*/
|
||||
Max_locks = (int) $3; /*PL*/
|
||||
} /*PL*/
|
||||
| /* empty */ /*PL*/
|
||||
= { /*PL*/
|
||||
Max_locks = -1; /*PL*/
|
||||
} /*PL*/
|
||||
; /*PL*/
|
||||
timeout: TIMEOUT IS ICONST /*PL*/
|
||||
= { /*PL*/
|
||||
Time_out = (int) $3; /*PL*/
|
||||
} /*PL*/
|
||||
| /* empty */ /*PL*/
|
||||
= { /*PL*/
|
||||
Time_out = -1; /*PL*/
|
||||
} /*PL*/
|
||||
; /*PL*/
|
||||
append: APPEND rel
|
||||
= {
|
||||
bgn_append(FALSE);
|
||||
}
|
||||
| APPEND
|
||||
= {
|
||||
bgn_append(TRUE);
|
||||
}
|
||||
;
|
||||
dom_assign: dom_assign COMMA assign
|
||||
| assign
|
||||
;
|
||||
assign: dom IS value
|
||||
= {
|
||||
convert();
|
||||
}
|
||||
;
|
||||
dom: DOM name
|
||||
= {
|
||||
$$ = (char *) att_lookup($2, FALSE);
|
||||
}
|
||||
| DOM ICONST
|
||||
= {
|
||||
$$ = (char *) dom_lookup($2, FALSE);
|
||||
}
|
||||
;
|
||||
value: scan_dom
|
||||
| scan_var
|
||||
| const
|
||||
= {
|
||||
Source.off = C_CONST;
|
||||
Source.c_var = $1;
|
||||
}
|
||||
;
|
||||
scan_dom: DOM name
|
||||
= {
|
||||
$$ = (char *) att_lookup($2, TRUE);
|
||||
}
|
||||
| DOM ICONST
|
||||
= {
|
||||
$$ = (char *) dom_lookup($2, TRUE);
|
||||
}
|
||||
;
|
||||
get: GET rel c_var
|
||||
= {
|
||||
if (Destination.type != opLONG)
|
||||
amxerror(215, Destination.c_var);
|
||||
else
|
||||
{
|
||||
bgn_scan(0);
|
||||
$$ = scan((AMX_REL *) 0, 0);
|
||||
}
|
||||
}
|
||||
;
|
||||
retrieve: over scan qual
|
||||
= {
|
||||
$$ = scan($1, 1);
|
||||
}
|
||||
;
|
||||
over: OVER name
|
||||
= {
|
||||
rel_lookup($2, AMX_INTERNAL);
|
||||
$$ = (char *) Relation;
|
||||
}
|
||||
| /* empty */
|
||||
= {
|
||||
$$ = (char *) 0;
|
||||
}
|
||||
;
|
||||
scan: SCAN rel
|
||||
= {
|
||||
bgn_scan(1);
|
||||
}
|
||||
;
|
||||
qual: qual COMMA expr
|
||||
| expr
|
||||
| /* empty */
|
||||
;
|
||||
expr: dom relop value
|
||||
= {
|
||||
qual((int) $1, (int) $2);
|
||||
}
|
||||
;
|
||||
relop: BDOP
|
||||
| IS
|
||||
;
|
||||
var_assign: LPAREN c_var_assign RPAREN
|
||||
| /* empty */
|
||||
;
|
||||
c_var_assign: c_var_assign COMMA c_assign
|
||||
| c_assign
|
||||
;
|
||||
c_assign: c_var IS scan_dom
|
||||
= {
|
||||
convert();
|
||||
}
|
||||
| c_var
|
||||
= {
|
||||
if (Destination.type != opLONG)
|
||||
amxerror(215, Destination.c_var);
|
||||
else
|
||||
fprintf(FILE_tmp, msg(217), Destination.c_var);
|
||||
}
|
||||
;
|
||||
scan_list: stmt_list
|
||||
| /* empty */
|
||||
;
|
||||
replace: REPLACE
|
||||
= {
|
||||
bgn_replace();
|
||||
}
|
||||
;
|
||||
deadlock: IF LPAREN DEADLK RPAREN /*PL*/
|
||||
= { /*PL*/
|
||||
fprintf(FILE_tmp, msg(83)); /*PL*/
|
||||
fprintf(FILE_tmp, msg(208)); /*PL*/
|
||||
} /*PL*/
|
||||
; /*PL*/
|
||||
print: PRINT
|
||||
= {
|
||||
fprintf(FILE_tmp, msg(208));
|
||||
}
|
||||
;
|
||||
dom_list: dom_list COMMA scan_dom
|
||||
= {
|
||||
w_print((int) $3);
|
||||
}
|
||||
| scan_dom
|
||||
= {
|
||||
w_print((int) $1);
|
||||
}
|
||||
| /* empty */
|
||||
= {
|
||||
w_print(0);
|
||||
}
|
||||
;
|
||||
const: ICONST
|
||||
= {
|
||||
Source.type = opINT;
|
||||
Source.len = sizeof (short);
|
||||
}
|
||||
| LCONST
|
||||
= {
|
||||
Source.type = opLONG;
|
||||
Source.len = sizeof (long);
|
||||
}
|
||||
| RCONST
|
||||
= {
|
||||
Source.type = opDOUBLE;
|
||||
Source.len = sizeof (double);
|
||||
}
|
||||
| SCONST
|
||||
= {
|
||||
Source.type = opSTRING;
|
||||
Source.len = AAlength($1);
|
||||
}
|
||||
;
|
||||
/* C VARIABLE DECLARATION */
|
||||
declaration: decl_specifier decl_list SEMICOL
|
||||
= {
|
||||
fprintf(FILE_tmp, ";\n");
|
||||
Type_spec = opINT;
|
||||
}
|
||||
;
|
||||
decl_specifier: type_specifier
|
||||
| sc_specifier
|
||||
| type_specifier sc_specifier
|
||||
| sc_specifier type_specifier
|
||||
;
|
||||
type_specifier: TYPE
|
||||
= {
|
||||
fprintf(FILE_tmp, "%s\t", TYPE_SPEC[(int) $1]);
|
||||
Type_spec = (int) $1;
|
||||
}
|
||||
;
|
||||
sc_specifier: ALLOC
|
||||
= {
|
||||
fprintf(FILE_tmp, "%s\t", SC_SPEC[(int) $1]);
|
||||
}
|
||||
;
|
||||
decl_list: declarator
|
||||
| declarator comma decl_list
|
||||
;
|
||||
comma: COMMA
|
||||
= {
|
||||
fprintf(FILE_tmp, ", ");
|
||||
}
|
||||
;
|
||||
declarator: NAME
|
||||
= {
|
||||
if (Type_spec == opSTRING)
|
||||
amxerror(112, $1);
|
||||
else
|
||||
{
|
||||
ctbl($1, Type_spec);
|
||||
fprintf(FILE_tmp, "%s", $1);
|
||||
}
|
||||
}
|
||||
| STAR NAME
|
||||
= {
|
||||
if (Type_spec != opSTRING)
|
||||
amxerror(114, TYPE_SPEC[Type_spec], $2);
|
||||
else
|
||||
{
|
||||
ctbl($2, opSTRING);
|
||||
fprintf(FILE_tmp, "*%s", $2);
|
||||
}
|
||||
}
|
||||
| lbrkt blob RBRKT
|
||||
= {
|
||||
ctbl($1, opSTRING);
|
||||
putc(']', FILE_tmp);
|
||||
}
|
||||
;
|
||||
lbrkt: NAME LBRKT
|
||||
= {
|
||||
if (Type_spec != opSTRING)
|
||||
amxerror(116, TYPE_SPEC[Type_spec], $1);
|
||||
else
|
||||
fprintf(FILE_tmp, "%s[", $1);
|
||||
}
|
||||
;
|
||||
blob: NAME
|
||||
= {
|
||||
fprintf(FILE_tmp, "%s", $1);
|
||||
}
|
||||
| ICONST
|
||||
= {
|
||||
fprintf(FILE_tmp, "%d", (int) $1);
|
||||
}
|
||||
;
|
||||
c_var: NAME
|
||||
= {
|
||||
decl($1, FALSE);
|
||||
}
|
||||
;
|
||||
scan_var: NAME
|
||||
= {
|
||||
decl($1, TRUE);
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
%%
|
||||
|
||||
|
||||
# include "tables.y"
|
||||
Loading…
Reference in New Issue