This commit is contained in:
Oliver Lehmann 1989-12-12 14:43:12 +00:00
parent 4f64c97b71
commit 074dc76d34
1 changed files with 539 additions and 0 deletions

View File

@ -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"