1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-27 12:42:10 +00:00

Original files for GT, from PCC20.

This commit is contained in:
Lars Brinkhoff
2018-10-24 10:42:08 +02:00
parent dbec826082
commit db7346cb8d
15 changed files with 4549 additions and 0 deletions

115
src/c/cmac.gt Normal file
View File

@@ -0,0 +1,115 @@
typenames (char, int, float, double);
regnames (a, b);
memnames (reg, auto, ext, stat, param, label, intlit, floatlit,
stringlit, ia, ib);
size 1 (char, int, float, double);
align 1 (char, int, float, double);
class r (a, b);
saveareasize 8;
pointer p0 (1);
offsetrange p0 (0, 0);
returnreg a (int, double, p0);
type char(r), int(r), float(r), double(r), p0(r);
.sw: a,,1;
+i: -i: *i: /i: %: <<: >>:
&: .OR: ^: +p0: -p0: -p0p0: a,b,a;
.BNOT: -ui: r,,1;
&u0: M,,r;
.ic: .ci: .ip0: .p0i: r,,1;
==p0: !=p0: <p0: >p0: <=p0: >=p0:
==i: !=i: <i: >i: <=i: >=i: a,b,label;
==0p0: !=0p0: a,,label;
macros
+i: " CADD"
-i: " CSUB"
*i: " CMUL"
/i: " CDIV"
%: " CMOD"
<<: " CLS"
>>: " CRS"
&: " CAND"
.OR: " COR"
^: " CXOR"
+p0: " PINC"
-p0: " PDEC"
-p0p0: " PSUB"
-ui: " CMINUS #R"
.BNOT: " CNOT #R"
&u0:
(auto,,): " LAAUTO #R,#F"
(ext,,): " LAEXTN #R,#F"
(stat,,): " LASTAT #R,#F"
(param,,): " LAPARM #R,#F"
(stringlit,,): " LASTRG #R,#F"
==i: ==p0: " JEQ #R"
!=i: !=p0: " JNE #R"
<i: <p0: " JLT #R"
>i: >p0: " JGT #R"
<=i: <=p0: " JLE #R"
>=i: >=p0: " JGE #R"
==0p0: " JNULL #R"
!=0p0: " JNNULL #R"
.cc: .ii: .p0p0:
(r,,r): " LREG #R,#F"
(auto,,): " LAUTO #R,#F"
(ext,,): " LEXTRN #R,#F"
(stat,,): " LSTAT #R,#F"
(param,,): " LPARM #R,#F"
(ia|ib,,): " LVPTR #R,#F"
(intlit,,): " LLIT #R,#F"
(,,auto): " STAUTO #F,#R"
(,,ext): " STEXTN #F,#R"
(,,stat): " STSTAT #F,#R"
(,,param): " STPARM #F,#R"
(,,ia|ib): " STVPTR #F,#R"
.ic: .ci:
.ip0: .p0i: "\"
hd: " HEAD"
end: " CEND"
en: " CENTRY #0"
ex: " CEXTRN #0"
eq: " CEQU #0"
l: " LABDEF #0"
st: " STATIC #0"
ln: " LINNUM #0"
ad0:
(,,ext): " ADCON #R"
(,,stat): " SADCON #R"
in: c: " INTCON #0"
lc: " LABCON #0"
sc: " STRCON #0"
z: " CZERO #0"
p: " PROLOG #0,%i(#1)"
ep: " EPILOG #0,#1"
ca:
(ext,,): " CCALL #0,#1,#F"
(ia|ib,,): " CALREG #0,#1,#F"
rt: " CRETRN"
go: " CGOTO #R"
ts: " TSWITCH #0,#5,#2"
ets: " ETSWIT #0,#5,#2"
ls: " LSWITCH #0,#2"
els: " ELSWIT #0,#2"
pu: pd: " PURE"
im: da: " IMPURE"
al: "\"

85
src/c/g0.c Normal file
View File

@@ -0,0 +1,85 @@
# include "gt.h"
/*
GT Compiler
Section 0: Command Routine
*/
/**********************************************************************
Command Usage: GT {-options} source.file
Output is written on the file "source.gtout".
Options:
d - print parser debugging info
t - print tokens
**********************************************************************/
/**********************************************************************
External Routines used by GT compiler:
copen open file for input/output
cgetc read character
cputc write character
ceof test for end-of-file
cclose close file
cexit terminate process
apfname append suffix to file name
plus C24.C (parser) and C96.C (cprint)
**********************************************************************/
char *fn_source,
*fn_out,
fnbuff[40];
main (argc, argv) int argc; char *argv[];
{int f, i, c;
extern int debug, tflag;
char *s;
/* check for options */
if (argc > 1 && (s = argv[1])[0] == '-') i = 2;
else {i = 1; s = 0;}
/* check for file name */
if (argc <= i)
{cprint ("Usage: GT description.file\n");
cexit (100);
}
/* process options */
if (s) while (c = *++s) switch (c) {
case 'd': debug = TRUE; break;
case 't': tflag = TRUE; break;
default: cprint ("unrecognized option: '%c'\n", c);
}
/* check that source file exists */
fn_source = argv[i];
if ((f = copen (fn_source, MREAD, TEXT)) == OPENLOSS)
{cprint ("Can't Find '%s'.\n", fn_source);
cexit (100);
}
cclose (f);
apfname (fnbuff, fn_source, "gtout");
fn_out = fnbuff;
pinit ();
parse ();
cleanup (0);
}

505
src/c/g1.c Normal file
View File

@@ -0,0 +1,505 @@
# include "gt.h"
/*
GT Compiler
Section 1: Lexical Analyzer
*/
/**********************************************************************
A token consists of a TAG and an INDEX.
The valid token TAGs are listed in the include file.
The interpretation of the INDEX is dependent upon the TAG:
T_AMOP the number of the abstract_machine_operator
TIDN index of identifier name in CSTORE
TINTCON value of integer constant
TSTRING index of source representation in CSTORE
others the line number upon which the token appeared
**********************************************************************/
char *keyn[] {
"typenames",
"align",
"pointer",
"class",
"conflict",
"type",
"memnames",
"macros",
"size",
"indirect",
"regnames",
"returnreg",
"saveareasize",
"offsetrange",
"m",
0};
int keyv[] {
_TYPENAMES,
_ALIGN,
_POINTER,
_CLASS,
_CONFLICT,
_TYPE,
_MEMNAMES,
_MACROS,
_SIZE,
_INDIRECT,
_REGNAMES,
_RETURNREG,
_SAVEAREASIZE,
_OFFSETRANGE,
_M};
/* character type array */
# define _ALPHA 50 /* identifier or keyword */
# define _DIGIT 51 /* constant or identifier */
# define _QUOTE 52 /* character string indicator */
# define _AMOP 53 /* character beginning an abstract_machine_operation */
# define _EOL 54 /* newline */
# define _BLANK 55 /* blank, tab, VT, FF, CR */
# define _BAD 56 /* invalid character */
# define _MINUS 57 /* minus sign: integer or AMOP */
# define _NAME (typ[t]==_ALPHA || typ[t]==_DIGIT)
int typ[] {
_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD,
_BAD, _BLANK, _EOL, _BLANK, _BLANK, _BLANK, _BAD, _BAD,
_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD,
_BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD, _BAD,
_BLANK, _AMOP, _QUOTE, _BAD, _BAD, _AMOP, _AMOP, _BAD,
_LPARN, _RPARN, _AMOP, _AMOP, _COMMA, _MINUS, _AMOP, _AMOP,
_DIGIT, _DIGIT, _DIGIT, _DIGIT, _DIGIT, _DIGIT, _DIGIT, _DIGIT,
_DIGIT, _DIGIT, _COLON, _SEMI, _AMOP, _AMOP, _AMOP, _AMOP,
_BAD, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA,
_ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA,
_ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA,
_ALPHA, _ALPHA, _ALPHA, _LBRAK, _BAD, _RBRAK, _AMOP, _ALPHA,
_BAD, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA,
_ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA,
_ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA, _ALPHA,
_ALPHA, _ALPHA, _ALPHA, _BAD, _OR, _BAD, _NOT, _BAD};
/* translation table */
int trt[] {
000,001,002,003,004,005,006,007,010,' ','\n',' ',' ',' ',016,017,
020,021,022,023,024,025,026,027,030,031,032,033,034,035,036,037,
' ','!','"','#','$','%','&','\'','(',')','*','+',',','-','.','/',
'0','1','2','3','4','5','6','7','8','9',':',';','<','=','>','?',
0100,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z','[','\\',']','^','_',
0140,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o',
'p','q','r','s','t','u','v','w','x','y','z','{','|','}','~',0177 };
/* hash table, holds keywords and identifiers */
# define hentry struct _hentry
hentry
{char *hnp; /* pointer to string in cstore */
int hclass; /* 1 - identifier, >1 - keyword type,
<=0 - manifest constant, index in mcdef */
};
/* identifier classes */
# define h_idn 1
hentry hshtab[hshsize], *lookup(), *lookx();
int hshused 0; /* number of entries used */
/* character store: holds keywords and identifiers */
char cstore[cssiz];
char *cscsp -1; /* current string pointer: points to first
unused character in cstore */
char *cscnp -1; /* current name pointer: points to last unused
character in cstore */
char *cp; /* pointer to working string */
/* communication between lexical routines */
extern int lextag, lexindex, lexline;
int ccard, /* indicates that current
tokens should be interpreted
by the lexical phase */
lccard, /* lgetc local ccard */
c, /* current untranslated input char */
t, /* current translated input char */
peekt, /* lookahead translated character */
truncate; /* indicates that cstore is full */
/* FILES */
int f_source -1; /* source file */
extern char *fn_source;
int i_line, /* current line number */
i_eof, /* indicates end-of-file */
i_nlflag; /* indicates first char of line */
/* manifest constants */
int jdefine, /* index of "DEFINE" in hashtab */
mcdef[mcdsz], /* storage of manifest constant
definitions */
*cmcdp {mcdef}; /* pointer to next free word in mcdef */
char *eopch[] {
"-ui", "-ud", "++bi", "++ai", "--bi", "--ai", ".bnot", "!",
".lseq", "", ".sw", "++bc", "++ac", "--bc", "--ac", "&u0",
"&u1", "&u2", "&u3", "*u", "==0p0", "==0p1", "==0p2", "==0p3",
"!=0p0", "!=0p1", "!=0p2", "!=0p3", "", "", "", "",
".ci", ".cf", ".cd", ".ic", ".if", ".id", ".ip0", ".ip1",
".ip2", ".ip3", ".fc", ".fi", ".fd", ".dc", ".di", ".df",
".p0i", ".p0p1", ".p0p2", ".p0p3", ".p1i", ".p1p0", ".p1p2", ".p1p3",
".p2i", ".p2p0", ".p2p1", ".p2p3", ".p3i", ".p3p0", ".p3p1", ".p3p2",
"+i", "=+i", "+d", "=+d", "-i", "=-i", "-d", "=-d",
"*i", "=*i", "*d", "=*d", "/i", "=/i", "/d", "=/d",
"%", "=%", "<<", "=<<", ">>", "=>>", "&", "=&",
"^", "=^", ".or", "=or", "&&", ".tvor", "-p0p0", "=",
".argi", ".argd", ".arg0", ".arg1", ".arg2", ".arg3", "+p0", "+p1",
"+p2", "+p3", "-p0", "-p1", "-p2", "-p3", "", "",
".cc", ".ii", ".ff", ".dd", ".p0p0", ".p1p1", ".p2p2", ".p3p3",
"", "?", ".", "call", "float", "string", "int", "idn",
"==i", "!=i", "<i", ">i", "<=i", ">=i", "==d", "!=d",
"<d", ">d", "<=d", ">=d", "==p0", "!=p0", "<p0", ">p0",
"<=p0", ">=p0", "==p1", "!=p1", "<p1", ">p1", "<=p1", ">=p1",
"==p2", "!=p2", "<p2", ">p2", "<=p2", ">=p2", "==p3", "!=p3",
"<p3", ">p3", "<=p3", ">=p3", "", "", "", "",
"++bf", "++af", "--bf", "--af", "++bd", "++ad", "--bd", "--ad",
"++bp0", "++ap0", "--bp0", "--ap0", "++bp1", "++ap1", "--bp1", "--ap1",
"++bp2", "++ap2", "--bp2", "--ap2", "++bp3", "++ap3", "--bp3", "--ap3"};
/**********************************************************************
GETTOK - Get Next Token
Sets variables LEXTAG, LEXINDEX, LEXLINE. This routine
implements compiler control lines.
**********************************************************************/
gettok ()
{while (TRUE)
{tokget();
if (ccard)
{if (lextag==TIDN && lexindex==jdefine)
defccl ();
else {error (1004, lexline);
while (lextag) tokget();
}
continue;
}
return;
}
}
/**********************************************************************
DEFCCL - Handle DEFINE Compiler Control Line
**********************************************************************/
defccl ()
{hentry *hp;
int k;
tokget ();
if (lextag != TIDN)
{error (1003, lexline);
while (lextag) tokget ();
}
else
{hp = lookx ();
k = -(cmcdp-mcdef);
do
{tokget();
if(cmcdp >= &mcdef[mcdsz-1])
error(4004, lexline);
*cmcdp++ = lextag;
if (lextag<TIDN) lexindex = UNDEF;
*cmcdp++ = lexindex;
}
while (lextag);
--cmcdp;
hp->hclass = k;
}
}
/**********************************************************************
TOKGET - Internal Get Token Routine
**********************************************************************/
tokget ()
{static int *mcp, mcflag;
int sum, flag, i;
char buf[40];
hentry *hp;
while (TRUE)
{if (mcflag)
{lextag= *mcp++;
lexindex= *mcp++;
if (lexindex==UNDEF) lexindex=lexline;
if (lextag) return;
mcflag=FALSE;
}
if (peekt) t=peekt;
else t=trt[lgetc()];
if (!t) break;
peekt=NULL;
flag = truncate = FALSE;
cp = cscsp; /* character stack pointer */
lexline = i_line; /* lgetc current line */
ccard =| lccard; /* set control card indicator */
switch (typ[t]) {
case _ALPHA: do move(t); while (_NAME);
*cp = 0;
hp = lookup (cscsp);
peekt = t;
if (hp->hclass > 1) /* keyword */
{lextag = hp->hclass;
lexindex = lexline;
}
else if (hp->hclass <= 0) /* manifest constant */
{mcflag = TRUE;
mcp = mcdef + -hp->hclass;
continue;
}
else /* identifier */
{lextag = TIDN;
lexindex = hp->hnp - cstore;
if (truncate) error (4001,lexline);
}
return;
case _MINUS: move(0); /* look at next char */
if (typ[t] != _DIGIT)
{peekt = '-';
goto l_amop;
}
flag = TRUE;
case _DIGIT: /* fall through */
sum = 0;
do
{sum = sum*10 + t-'0';
move (0);
} while (typ[t] == _DIGIT);
lextag = TINTCON;
lexindex = (flag ? -sum : sum);
peekt = t;
return;
case _AMOP: /* abstract machine operator */
l_amop: i = 0;
if (peekt) buf[i++]=peekt;
do {buf[i++]=t; move(0);}
while(typ[t]==_AMOP || typ[t]==_ALPHA
|| typ[t]==_DIGIT || typ[t]==_MINUS );
peekt = t;
buf[i]=0;
for (i=0;i<eopchsz;i++)
if (stcmp(buf,eopch[i]))
{lextag = T_AMOP;
lexindex = i;
return;
}
error (1002, lexline);
continue;
case _QUOTE: /* character string */
lexindex = cscsp - cstore;
move(0); /* get next character */
while (t)
{if (t=='"')
{move (0);
if (t != '"') break;
}
move (c);
}
if (!t) error (2001, lexline);
if (truncate) error (4001, lexline);
lextag = TSTRING;
cscsp = cp;
*cscsp++ = 0;
peekt = t;
return;
case _EOL: if (ccard)
{ccard=FALSE;
lextag=LEXEOF;
return;
}
case _BLANK: continue;
case _BAD: error (1000, lexline);
continue;
default: /* single character operator */
lextag = typ[t];
lexindex = lexline;
return;
}
}
lextag = TEOF;
lexindex = lexline;
}
/**********************************************************************
MOVE - Move Character Into Buffer and Advance Input
**********************************************************************/
move (u)
{if (u) if (cp<cscnp-1) *cp++ = u; else truncate=TRUE;
return (t=trt[c=lgetc()]);
}
/**********************************************************************
LOOKUP - lookup or enter a symbol in the hash table
**********************************************************************/
hentry *lookup (np) char *np;
{int i, u;
char *p, *ep;
hentry *hp;
i = 0;
p = np;
while (u = *p++) i =+ (u & 0177);
if (i<0) i = -i;
i =% hshsize;
/* search entries until found or empty */
while (ep = hshtab[i].hnp)
if (stcmp(np,ep)) return (&hshtab[i]);
else if (++i>=hshsize) i=0;
/* not found, so enter */
if (++hshused >= hshsize) error (4000,lexline);
while (--p >= np) *cscnp-- = *p; /* move name */
hp = &hshtab[i];
hp->hnp = cscnp+1;
hp->hclass = h_idn;
return (hp);
}
/**********************************************************************
LOOKX - lookup current identifier
**********************************************************************/
hentry *lookx ()
{return (lookup (&cstore[lexindex]));}
/**********************************************************************
LXINIT - Lexical Phase Initializaton Routine
**********************************************************************/
lxinit()
{int i;
char *s;
f_source = xopen (fn_source, MREAD, TEXT);
cscsp = cstore;
cscnp = &cstore[cssiz-1];
lexline = i_line = 1;
i_eof = FALSE;
i_nlflag = TRUE;
i = 0;
while (s = keyn[i]) keyword (s, keyv[i++]);
jdefine=lookup("define")->hnp-cstore;
}
/**********************************************************************
KEYWORD - Define a Reserved Word
**********************************************************************/
int keyword (s, type) int type; char *s;
{lookup(s)->hclass = type;}
/**********************************************************************
LGETC - Character Input Routine
**********************************************************************/
int lgetc()
{int ch;
if (i_eof) return (LEXEOF);
while (TRUE)
{ch = cgetc (f_source);
if (ceof (f_source))
{i_eof=TRUE;
return (LEXEOF);
}
if (trt[ch]=='\n')
{++i_line;
lccard=FALSE;
i_nlflag=TRUE;
}
else if (i_nlflag)
{i_nlflag=FALSE;
if (trt[ch]=='#')
{lccard=TRUE;
continue;
}
}
return (ch);
}
}
/**********************************************************************
STCMP - Compare Strings
**********************************************************************/
int stcmp (s1, s2) char *s1,*s2;
{int u;
while ((u = *s1++) == *s2++) if (!u) return (TRUE);
return (FALSE);
}


153
src/c/g2.c Normal file
View File

@@ -0,0 +1,153 @@
# include "gt.h"
/*
GT Compiler
Section 2: Parser Interface
*/
extern int lineno;
extern char cstore[], *fn_out;
int f_out -1;
/**********************************************************************
Parser Error Message Routines
**********************************************************************/
synerr (line) {error (2007, line);}
giveup (line) {error (4012, line);}
stkovf (line) {error (4003, line);}
delmsg (line) {error (2012, line);}
skpmsg (line) {error (2013, line);}
qprint (q) {error (2008, -1, q);}
tprint (tp) token *tp; {error (2011, -1, tp->type, tp->index);}
pcursor () {error (2010, -1);}
stkunf (line) {error (6006, line);}
tkbovf (line) {error (6002, line);}
badtwp (line) {error (6005, line);}
badtok (line, i) {error (6000, line, i);}
/**********************************************************************
PTOKEN - Print Token Routine
**********************************************************************/
ptoken (tp, f) token *tp;
{int type, index;
extern char *sterm[], *eopch[];
type = tp->type;
index = tp->index;
switch (type) {
case TIDN: cprint (f, "%s", &cstore[index]);
return;
case TINTCON: cprint (f, "%d", index);
return;
case TSTRING: cprint (f, "\"\"");
return;
case T_AMOP: cprint (f, "%s", eopch[index]);
return;
default: cprint (f, "%s", sterm[type]);
}
}
/**********************************************************************
PINIT - Parser Initialization Routine
**********************************************************************/
pinit ()
{extern int prm();
lxinit ();
f_out = xopen (fn_out, MWRITE, TEXT);
deffmt ('m', prm, 1);
}
/**********************************************************************
CLEANUP - Parser CleanUp Routine
**********************************************************************/
cleanup (rcode)
{cclose (f_out);
cexit (rcode);
}
/**********************************************************************
STACK FOR ACTION ROUTINES
**********************************************************************/
int stack[pssize];
int *sp {stack};
int *push (i)
{if (++sp >= &stack[pssize]) error (4007, lineno);
*sp = i;
return (sp);
}
int pop ()
{int i;
i = *sp--;
if (sp < stack) error (6001, lineno);
return (i);
}
int *setsp (nsp) int *nsp; /* set stack pointer */
{if (nsp < stack) error (6003, lineno);
if (nsp >= &stack[pssize]) error (6004, lineno);
return (sp = nsp);
}
int *top () /* get stack pointer */
{return (sp);
}
int *get_top (nsp) int *nsp; /* get list from top of stack */
{int *ot;
ot = top();
setsp (nsp-1);
return (ot);
}
/**********************************************************************
GPRINT - Formatted Print Routine
**********************************************************************/
gprint (fmt,x1,x2,x3) char fmt[];
{cprint (f_out, fmt, x1, x2, x3);}
/**********************************************************************
PRM - Print String in Cstore
**********************************************************************/
prm (i, f)
{cprint (f, "%s", &cstore[i]);}


1045
src/c/g3.c Normal file

File diff suppressed because it is too large Load Diff

308
src/c/g4.c Normal file
View File

@@ -0,0 +1,308 @@
# include "gt.h"
/*
GT Compiler
Section 4: Parsing Tables
*/
extern int copflag, amopl[], c_amopl, coplist;
extern int mactab[], macdef[], cmacro, lineno;
extern int val, line, *pv, *pl;
ar3 ()
{fs1();}
ar4 ()
{fs2();}
ar21 ()
{error(4025,lineno);}
ar22 ()
{ftype();}
ar23 ()
{error(4022,lineno);}
ar24 ()
{foploc();}
ar25 ()
{error(4023,lineno);}
ar26 ()
{fmacro();}
ar27 ()
{error(4024,lineno);}
ar56 ()
{amopl[c_amopl++]= -1;coplist=0;}
ar57 ()
{asave(pv[2]);}
ar58 ()
{asize(pv[1],pv[3]);}
ar59 ()
{aalign(pv[1],pv[3]);}
ar60 ()
{apoint(pv[1],pv[3]);}
ar61 ()
{aclass(pv[1],pv[3]);}
ar62 ()
{aretreg(pv[1],pv[3]);}
ar63 ()
{atype(pv[1],pv[3]);}
ar64 ()
{aconf(pv[2],pv[4]);}
ar65 ()
{push(pv[3]);}
ar66 ()
{val=push(pv[1]);}
ar67 ()
{push(pv[3]);}
ar68 ()
{val=push(pv[1]);}
ar69 ()
{atnames(pv[3]);}
ar70 ()
{amnames(pv[3]);}
ar71 ()
{arnames(pv[3]);}
ar72 ()
{aor1(pv[1],pv[3],pv[5]);}
ar73 ()
{aor2(pv[1],pv[3]);}
ar74 ()
{aor3(pv[1],pv[4]);}
ar75 ()
{aor4(pv[1]);}
ar78 ()
{aoploc(pv[6]);}
ar79 ()
{aamop(pv[1]);}
ar80 ()
{aamop(pv[1]);}
ar81 ()
{aopl(0,copflag,pv[1]);}
ar82 ()
{aopl(1,copflag,pv[1]);}
ar83 ()
{aopl(1,0,0);}
ar84 ()
{aopl(2,copflag,pv[1]);}
ar86 ()
{copflag=pv[1]+2;val=0;}
ar87 ()
{val=pv[1] | pv[3];}
ar88 ()
{val= ~pv[2];}
ar89 ()
{val=pv[2];}
ar90 ()
{val=aope(-1);}
ar91 ()
{val=aope(-2);}
ar92 ()
{val=aope(pv[1]);}
ar93 ()
{val=aclobber(pv[2]);}
ar94 ()
{val=0;}
ar95 ()
{macdef[cmacro++]=pv[2];mpush(-1);}
ar100 ()
{mpush(-3);val=pv[2];}
ar101 ()
{val=mpsh2(3,-3);}
ar102 ()
{val=mpsh2(copflag,pv[1]);copflag=0;}
ar103 ()
{val=mpsh2(0,0);}
ar104 ()
{mactab[pv[1]]=cmacro;}
ar105 ()
{nmac(pv[1],cmacro);}
ar106 ()
{push(pv[3]);}
ar107 ()
{val=push(pv[1]);}
int (*act[])() {
0, 0, 0, ar3, ar4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, ar21, ar22, ar23, ar24, ar25, ar26, ar27, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, ar56, ar57, ar58, ar59, ar60, ar61,
ar62, ar63, ar64, ar65, ar66, ar67, ar68, ar69, ar70, ar71,
ar72, ar73, ar74, ar75, 0, 0, ar78, ar79, ar80, ar81, ar82,
ar83, ar84, 0, ar86, ar87, ar88, ar89, ar90, ar91, ar92,
ar93, ar94, ar95, 0, 0, 0, 0, ar100, ar101, ar102, ar103,
ar104, ar105, ar106, ar107, -1};
int r1[] {
0, 1, 2, 3, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9,
9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16,
17, 17, 18, 19, 19, 20, 21, 21, 22, 23, 23, 24, 25, 25,
26, 27, 27, 28, 29, 29, 30, 31, 31, 32, 33, 34, 35, 36,
37, 38, 39, 40, 41, 41, 42, 42, 43, 44, 45, 46, 46, 46,
46, 47, 47, 48, 49, 49, 50, 51, 51, 52, 53, 53, 54, 54,
54, 54, 54, 54, 55, 55, 56, 57, 57, 58, 58, 59, 59, 60,
60, 61, 61, 62, 62, -1};
int r2[] {
0, 2, 8, 1, 1, 2, 0, 1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 2, 1, 2, 1, 3, 3, 1, 3, 3, 1,
3, 3, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 3, 3, 1, 2,
3, 4, 4, 4, 4, 4, 4, 5, 3, 1, 3, 1, 5, 5, 5, 6, 5, 5, 4,
2, 1, 7, 3, 2, 1, 1, 0, 1, 1, 1, 3, 2, 3, 1, 1, 1, 3, 0,
2, 3, 2, 2, 1, 9, 1, 1, 0, 1, 1, 3, 1, -1};
int g[] {
0, 0, 2, 0, 3, 0, 5, 0, 4, 0, 10, 0, 6, 0, 23, 0, 15, 0,
37, 0, 66, 0, 98, 0, 152, 0, 99, 0, 153, 0, 24, 0, 52,
0, 25, 0, 40, 0, 26, 0, 43, 0, 27, 0, 46, 0, 16, 0, 34,
0, 38, 0, 63, 0, 67, 0, 95, 0, 28, 0, 49, 99, 126, 0, 100,
0, 29, 82, 111, 0, 53, 70, 103, 0, 41, 73, 105, 0, 44,
76, 107, 0, 47, 93, 120, 0, 64, 123, 148, 0, 96, 79, 109,
0, 50, 0, 50, 31, 57, 32, 58, 68, 102, 74, 106, 80, 110,
91, 119, 121, 147, 185, 188, 0, 56, 0, 11, 0, 12, 0, 13,
61, 90, 0, 35, 0, 133, 133, 159, 0, 134, 124, 149, 0, 101,
0, 135, 0, 173, 0, 182, 160, 174, 180, 183, 0, 136, 127,
157, 128, 158, 161, 175, 166, 176, 181, 176, 187, 176,
0, 137, 0, 186, 153, 165, 0, 154, 0, 155, 0, 168, 168,
178, 0, 169, 181, 184, 187, 190, 0, 177, 155, 170, 0, 156,
0, 156, -1};
int pg[] {
0, 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27,
29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55,
57, 59, 61, 65, 67, 71, 75, 79, 83, 87, 91, 95, 97, 115,
117, 119, 121, 125, 127, 131, 135, 137, 139, 141, 147,
161, 163, 167, 169, 171, 175, 181, 185, -1};
int nbpw {16};
int nwpbt {2};
int a[] {
0, 0, 0, 60, 30, 85, 185, 191, 124, 61, 161, 128, 97, 7,
17, 18, 19, 20, 65, 8, 125, 21, 129, 9, 36, 22, 14, 130,
33, 39, 167, 12294, 4097, 16384, 0, 12299, 20481, 8192,
136, 12291, 4122, 8206, 12307, 20481, 49152, 547, 12292,
4100, 8222, 0, 4100, 8223, 0, 4100, 8224, 0, 12293, 12295,
12297, 12296, 4124, 8225, 0, 4120, 8228, 12309, 12306,
4125, 8231, 0, 4124, 8234, 0, 4124, 8237, 0, 4100, 8240,
0, 4125, 8243, 0, 4125, 8246, 0, 12298, 12300, 12301, 12304,
12302, 12303, 12305, 4124, 8247, 0, 4100, 8251, 0, 4099,
8252, 4105, 8253, 0, 12334, 4124, 8254, 0, 4114, 8257,
12311, 12308, 4100, 8260, 0, 4099, 8261, 4105, 8262, 0,
12325, 4100, 8263, 0, 4099, 8264, 4105, 8265, 0, 12328,
4100, 8266, 0, 4099, 8267, 4105, 8268, 0, 12331, 4124,
8269, 0, 4099, 8270, 4105, 8271, 0, 12343, 4100, 8272,
0, 4099, 8273, 4105, 8274, 0, 12322, 4099, 8275, 0, 12356,
4101, 8277, 4105, 8276, 0, 4101, 8278, 4105, 8276, 0, 4101,
8279, 4105, 8276, 0, 4105, 8281, 4125, 8280, 0, 12332,
4124, 8225, 0, 4100, 8283, 0, 4099, 8284, 4105, 8285, 0,
12337, 4124, 8286, 0, 4108, 8289, 12313, 12310, 12323,
4125, 8231, 0, 4125, 8296, 0, 12326, 4124, 8234, 0, 12329,
4124, 8237, 0, 4105, 8300, 0, 12341, 4100, 8240, 0, 12320,
4125, 8243, 0, 12345, 4124, 8304, 0, 4099, 8305, 0, 4099,
8306, 0, 4099, 8307, 0, 4105, 8308, 0, 4101, 8310, 4125,
8309, 0, 12333, 12335, 4124, 8254, 0, 4100, 8313, 0, 4099,
8314, 4105, 8315, 0, 12340, 4104, 8316, 0, 4116, 8317,
0, 4108, 8289, 12312, 12317, 20481, 2048, 2112, 4100, 8319,
4124, 8323, 4125, 8324, 0, 4101, 8330, 4105, 8276, 0, 12324,
4101, 8331, 0, 12327, 4101, 8332, 4105, 8276, 0, 12330,
4124, 8333, 0, 12342, 4101, 8334, 4105, 8276, 0, 12321,
12355, 12357, 12358, 12359, 4101, 8336, 4125, 8335, 0,
4101, 8337, 0, 12363, 4101, 8338, 4105, 8276, 0, 12336,
12338, 4124, 8286, 0, 4108, 8289, 12368, 4108, 8342, 4124,
8343, 12315, 12316, 20481, 2048, 2112, 4100, 8319, 4124,
8323, 0, 12378, 12379, 12380, 12374, 20481, 2048, 2112,
4100, 8319, 4124, 8323, 4125, 8324, 12344, 12365, 4105,
8352, 0, 12369, 4106, 8353, 12373, 12347, 12348, 12349,
4101, 8354, 0, 12346, 4101, 8355, 0, 12361, 12362, 12350,
4101, 8356, 4105, 8276, 0, 12339, 12367, 12392, 12393,
12290, 4108, 8342, 4124, 8343, 12314, 12319, 4100, 8358,
4108, 8342, 4124, 8343, 4126, 8359, 0, 4104, 8363, 0, 4101,
8364, 4106, 8353, 0, 12376, 12364, 20481, 2048, 2112, 4100,
8319, 4124, 8323, 4125, 8324, 12371, 12352, 12360, 12351,
12318, 20481, 2048, 2112, 4100, 8319, 4124, 8323, 12391,
12389, 4100, 8358, 4126, 8359, 12383, 12387, 4104, 8371,
0, 12385, 12377, 4105, 8372, 0, 12370, 12375, 4106, 8353,
12390, 4105, 8373, 0, 12386, 12384, 20481, 2048, 2112,
4100, 8319, 4124, 8323, 4125, 8324, 0, 20481, 2048, 2112,
4100, 8319, 4124, 8323, 12391, 4102, 8377, 12382, 12372,
4105, 8379, 0, 4099, 8381, 0, 20481, 2048, 2112, 4100,
8319, 4124, 8323, 12391, 4103, 8383, 4105, 8276, 0, 12366,
4101, 8384, 0, 12381, 4104, 8385, 0, 4126, 8386, 0, 12388,
-1};
int pa[] {
0, 31, 32, 35, 36, 40, 43, 47, 50, 53, 56, 57, 58, 59,
60, 63, 66, 67, 70, 73, 76, 79, 82, 85, 86, 87, 88, 89,
90, 91, 92, 92, 92, 95, 98, 103, 104, 107, 110, 111, 114,
119, 120, 123, 128, 129, 132, 137, 138, 141, 146, 147,
150, 155, 156, 159, 160, 165, 170, 175, 180, 181, 184,
187, 192, 193, 196, 199, 92, 200, 201, 204, 207, 208, 92,
211, 212, 215, 218, 219, 92, 222, 223, 226, 227, 230, 233,
236, 239, 242, 247, 92, 248, 249, 252, 255, 260, 261, 264,
267, 270, 271, 281, 286, 287, 290, 291, 296, 297, 300,
301, 306, 307, 308, 309, 310, 311, 316, 319, 320, 325,
92, 326, 327, 330, 333, 338, 339, 339, 347, 348, 349, 350,
351, 361, 362, 365, 366, 369, 370, 371, 372, 375, 376,
379, 380, 381, 382, 387, 388, 389, 390, 391, 392, 397,
398, 407, 410, 415, 416, 417, 339, 427, 428, 429, 430,
431, 439, 440, 445, 446, 449, 450, 451, 454, 455, 456,
459, 462, 463, 464, 474, 482, 485, 486, 92, 489, 492, 500,
505, 506, 509, 510, 513, 516, -1};


276
src/c/g5.c Normal file
View File

@@ -0,0 +1,276 @@
# include "gt.h"
/*
GT Compiler
Section 5: Error Message Editor
*/
/**********************************************************************
global variables
sterm table of GT terminal symbols
snterm table of GT nonterminal symbols
sq table of states
**********************************************************************/
extern char cstore[], *eopch[];
char *sterm[] {
"", "-|", "error", ";", "(", ")", "[", "]", ":", ",", "|",
"~", "amop", "TYPENAMES", "ALIGN", "POINTER", "CLASS",
"CONFLICT", "TYPE", "MEMNAMES", "MACROS", "SIZE", "INDIRECT",
"REGNAMES", "RETURNREG", "SAVEAREASIZE", "OFFSETRANGE",
"M", "idn", "integer", "string", 0};
char *snterm[] {
"", "$accept", "program", "$s1", "$s2", "$s1.list", "s1",
"$s2.list", "s2", "$or", "$r", "$t", "$o", "$m", "$o.list",
"$m.list", "$size", "s.list", "$align", "a.list", "$pointer",
"p.list", "$class", "c.list", "$offsetrange", "or.list",
"$returnreg", "r.list", "$type", "t.list", "$conflict",
"x.list", "$oploc", "$saveareasize", "s.elem", "a.elem",
"p.elem", "c.elem", "r.elem", "t.elem", "x.elem", "int_list",
"idn_list", "$typenames", "$memnames", "$regnames", "or.elem",
"oploc_list", "oploc", "oplist", "op1", "op2", "op3", "opl",
"ope", "clobber", "macro", "name_list", "cstring_list",
"cstring", "ope2", "name", "amop_list", 0};
int sq[] {
0, 0, 4098, 4099, 4101, 4100, 4103, 13, 19, 23, 4102, 4139,
4140, 4141, 26, 4105, 4120, 14, 15, 16, 17, 21, 25, 4104,
4112, 4114, 4116, 4118, 4126, 4129, 4, 4, 4, 28, 4121,
4142, 24, 4106, 4122, 29, 4115, 4131, 28, 4117, 4132, 28,
4119, 4133, 4, 4127, 4136, 29, 4113, 4130, 29, 28, 4138,
4138, 4138, 4, 3, 9, 28, 4123, 4134, 18, 4107, 4124, 4,
3, 9, 4, 3, 9, 4, 3, 9, 28, 3, 9, 4, 3, 9, 3, 9, 5, 5,
5, 29, 9, 4142, 4, 3, 9, 28, 4125, 4135, 12, 4108, 4110,
4128, 4145, 4138, 4131, 29, 4132, 4138, 4133, 9, 4136,
4138, 4130, 28, 3, 3, 3, 9, 29, 5, 4138, 4134, 4, 3, 9,
8, 20, 4128, 4, 11, 22, 27, 28, 29, 4143, 4144, 4146, 4149,
4150, 5, 5, 5, 28, 5, 29, 5, 5, 5, 4138, 4135, 4145, 12,
28, 4109, 4111, 4152, 4153, 4157, 4150, 4150, 4144, 9,
10, 5, 5, 5, 4152, 4, 30, 4154, 4155, 4157, 8, 5, 4147,
4149, 4150, 4150, 4156, 4155, 8, 9, 9, 4148, 4149, 4156,
6, 4151, 9, 4138, 3, 4156, 7, 5, 8, 30, -1};
/**********************************************************************
ERROR MESSAGES
**********************************************************************/
char *m1000[] {
/* 1000 */ "INVALID CHARACTER",
/* 1001 */ "INVALID ESCAPE CHARACTER",
/* 1002 */ "UNRECOGNIZED ABSTRACT MACHINE OPERATOR",
/* 1003 */ "INVALID MANIFEST CONSTANT DEFINITION",
/* 1004 */ "INVALID COMPILER CONTROL LINE",
/* 1005 */ "INVALID ESCAPE CONTROL LINE"
};
char *m2000[] {
/* 2000 */ 0,
/* 2001 */ "UNTERMINATED STRING CONSTANT",
/* 2002 */ "MULTIPLE TYPENAMES STATEMENTS IGNORED",
/* 2003 */ "MULTIPLE REGNAMES STATEMENTS IGNORED",
/* 2004 */ "MULTIPLE MEMNAMES STATEMENTS IGNORED",
/* 2005 */ "RETURN REGISTER FOR %t REDEFINED",
/* 2006 */ "%q DELETED",
/* 2007 */ "SYNTAX ERROR. PARSE SO FAR: ",
/* 2008 */ " %q",
/* 2009 */ "ALIGNMENT FACTORS MUST INCREASE",
/* 2010 */ " _ ",
/* 2011 */ " %t",
/* 2012 */ "DELETED: ",
/* 2013 */ "SKIPPED: ",
/* 2014 */ "MISSING SAVEAREASIZE STATEMENT",
/* 2015 */ "SIZE OF %t REDECLARED",
/* 2016 */ "SIZE OF %t NOT SPECIFIED",
/* 2017 */ "MACRO %t REDEFINED",
/* 2018 */ "ATTEMPT TO MIX REGISTER AND MEMORY IN LOCATION EXPRESSION",
/* 2019 */ 0,
/* 2020 */ "ALIGNMENT OF TYPE %t REDECLARED",
/* 2021 */ "INVALID ALIGMENT CLASS %d",
/* 2022 */ "NO POINTER CLASS CAN RESOLVE TYPE %t",
/* 2023 */ "ALIGNMENT CLASS FOR %t NOT SPECIFIED",
/* 2024 */ "SMALLEST ALIGNMENT FACTOR MUST BE 1",
/* 2025 */ 0,
/* 2026 */ "UNDEFINED POINTER CLASS %t",
/* 2027 */ "UNDEFINED REGISTER %t",
/* 2028 */ "UNDEFINED DATA TYPE %t",
/* 2029 */ "UNDEFINED MEMORY REFERENCE TYPE %t"
};
char *m4000[] {
/* 4000 */ "NAME TABLE OVERFLOW",
/* 4001 */ "NAME TABLE OVERFLOW",
/* 4002 */ "MACRO DEFINITION OVERFLOW",
/* 4003 */ "PROGRAM TOO COMPLICATED. PARSER STACK OVERFLOW.",
/* 4004 */ "MANIFEST CONSTANT DEFINITION TABLE OVERFLOW",
/* 4005 */ "PROGRAM TOO LARGE: SYMBOL TABLE OVERFLOW",
/* 4006 */ "TOO MANY NAMED MACROS",
/* 4007 */ 0,
/* 4008 */ 0,
/* 4009 */ 0,
/* 4010 */ 0,
/* 4011 */ 0,
/* 4012 */ "I GIVE UP",
/* 4013 */ "TYPENAMES STATEMENT MISSING",
/* 4014 */ "REGNAMES STATEMENT MISSING",
/* 4015 */ "MEMNAMES STATEMENT MISSING",
/* 4016 */ "TOO MANY POINTER CLASSES",
/* 4017 */ "TOO MANY REGISTERS",
/* 4018 */ "TOO MANY REGISTER CLASSES",
/* 4019 */ "TOO MANY DATA TYPES",
/* 4020 */ "TOO MANY MEMORY REFERENCE TYPES",
/* 4021 */ "POINTER STATEMENT MISSING",
/* 4022 */ "TYPE STATEMENT MISSING",
/* 4023 */ "OPLOC STATEMENTS MISSING",
/* 4024 */ "MACROS MISSING",
/* 4025 */ "RETURNREG STATEMENT MISSING"
};
char *m6000[] {
/* 6000 */ "T(P): ATTEMPT TO REFERENCE TOKEN %d",
/* 6001 */ "POP(P): STACK ERROR",
/* 6002 */ "LEX(P): TOKEN BUFFER OVERFLOW",
/* 6003 */ "SETSP(P): STACK POINTER TOO SMALL",
/* 6004 */ "SETSP(P): STACK POINTER TOO LARGE",
/* 6005 */ "LEX(P): INCONSISTENT TOKEN POINTERS",
/* 6006 */ "PARSE(P): ATTEMPT TO POP EMPTY PARSER STACK"
};
/**********************************************************************
DTOKEN - Print Token
**********************************************************************/
dtoken (type, index)
{extern int cout;
ptoken (&type, cout);
}
/**********************************************************************
EPRINT - Error Editor Formatted Print Routine
**********************************************************************/
eprint (fmt, x1, x2) char *fmt;
{int *argp, x, c;
char *s;
argp = &x1; /* argument pointer */
while (c = *fmt++)
{if (c != '%') eputc (c);
else
{x = *argp++;
switch (c = *fmt++) {
case 'd': /* decimal */ if (x<0) {x = -x; eputc ('-');}
eprd (x);
break;
case 'q': /* parser state */
x = sq[x];
if (x<0) break;
if (x<010000) eprint ("%s", sterm[x]);
else eprint ("<%s>", snterm[x-010000]);
break;
case 's': /* string */ s = x;
while (c = *s++) eputc (c);
break;
case 't': /* token */ dtoken (x, *argp++);
break;
default: eputc (c);
--argp;
}
}
}
}
/**********************************************************************
EPRD - Print Positive Decimal Integer
**********************************************************************/
eprd (n)
{int a;
if (a=n/10) eprd (a);
eputc (n%10+'0');
}
/**********************************************************************
EPUTC - Write a character onto standard output unit.
Break lines which exceed 60 characters.
**********************************************************************/
eputc (c)
{static int column;
extern int cout;
if (column >= 59 && c == ' ') c = '\n';
else if (column >= 80 && c != '\n')
{cputc ('\n', cout); column = 0;
}
cputc (c, cout);
if (c=='\n') column=0; else ++column;
}
/**********************************************************************
ERROR - Print Error Message
**********************************************************************/
error (errno, lineno, p1, p2)
{char *f, *getfmt();
if (lineno>0) eprint ("\n%d: ", lineno);
if (errno>=6000) eprint ("COMPILER ERROR. ");
if (errno < 2000)
f = getfmt (errno-1000, m1000, sizeof m1000);
else if (errno < 4000)
f = getfmt (errno-2000, m2000, sizeof m2000);
else if (errno < 6000)
f = getfmt (errno-4000, m4000, sizeof m4000);
else f = getfmt (errno-6000, m6000, sizeof m6000);
if (f==0) {f = "ERROR %d"; p1=errno;}
eprint (f, p1, p2);
if (errno>=4000) cleanup (1);
}
/**********************************************************************
GETFMT - get format given
N - relative error number
T - error message table
Z - size of error message table
**********************************************************************/
char *getfmt (n, t, z)
char *t[];
{int nm;
nm = z / sizeof t[0];
if (n < 0 || n >= nm) return (0);
return (t[n]);
}


152
src/c/gt.h Normal file
View File

@@ -0,0 +1,152 @@
/* dependencies upon host machine !! */
# define WORDMASK 077777777777 /* mask all but high 3 bits */
# define SMALLEST "-34359738368" /* smallest negative number */
/* table sizes */
# define hshsize 200 /* size of hash table for identifiers */
# define cssiz 5000 /* size of character store */
# define pssize 100 /* size of action routine stack */
# define mcdsz 200 /* manifest constant definition table size */
# define eopchsz 0300
/* various values */
# define MREAD 'r' /* read mode */
# define MWRITE 'w' /* write mode */
# define MAPPEND 'a' /* append mode */
# define TEXT "t" /* text file */
# define BINARY "b" /* binary file */
# define TRUE 1
# define FALSE 0
# define NULL 0
# define UNDEF -1
# define OPENLOSS -1
/* token types */
# define LEXEOF 0 /* internal end of file indicator */
# define TEOF 1 /* end of file */
# define _SEMI 3
# define _LPARN 4
# define _RPARN 5
# define _LBRAK 6
# define _RBRAK 7
# define _COLON 8
# define _COMMA 9
# define _OR 10
# define _NOT 11
# define T_AMOP 12 /* abstract machine operator */
# define _TYPENAMES 13
# define _ALIGN 14
# define _POINTER 15
# define _CLASS 16
# define _CONFLICT 17
# define _TYPE 18
# define _MEMNAMES 19
# define _MACROS 20
# define _SIZE 21
# define _INDIRECT 22
# define _REGNAMES 23
# define _RETURNREG 24
# define _SAVEAREASIZE 25
# define _OFFSETRANGE 26
# define _M 27
# define TIDN 28 /* identifiers */
# define TINTCON 29 /* integer constants */
# define TSTRING 30 /* string constants */
/* location expression modes */
# define l_unknown 0
# define l_register 1
# define l_memory 2
/* basic data types */
# define tchar 0 /* character */
# define tint 1 /* integer */
# define tfloat 2 /* float */
# define tdouble 3 /* double */
/* storage classes */
# define c_register 0 /* register */
# define c_temp 1 /* temporary */
# define c_auto 1 /* automatic */
# define c_extdef 2 /* external definition */
# define c_static 3 /* static */
# define c_param 4 /* parameter */
# define c_label 5 /* label */
# define c_integer 6 /* integer literal */
# define c_float 7 /* floating-point literal */
# define c_string 8 /* string literal */
# define c_indirect 9 /* indirection through reg #0 ... */
# define c_extern 50 /* external */
# define c_struct 51 /* structure type */
# define c_mos 52 /* member of structure */
# define c_dummy 53 /* dummy structure def -
for recursive definitions */
/* enodes */
# define e_iminus 0000
# define e_dminus 0001
# define e_incbi 0002
# define e_bnot 0006
# define e_not 0007
# define e_sw 0012
# define e_incbc 0013
# define e_a0 0017
# define e_a3 0022
# define e_ind 0023
# define e_jz0 0024
# define e_jz3 0027
# define e_jn0 0030
# define e_jn3 0033
# define e_addi 0100
# define e_eaddi 0101
# define e_subi 0104
# define e_esubi 0105
# define e_muli 0110
# define e_divi 0114
# define e_mod 0120
# define e_ls 0122
# define e_els 0123
# define e_rs 0124
# define e_ers 0125
# define e_band 0126
# define e_eand 0127
# define e_xor 0130
# define e_exor 0131
# define e_bor 0132
# define e_eor 0133
# define e_and 0134
# define e_or 0135
# define e_p0sub 0136
# define e_assign 0137
# define e_add0 0146
# define e_add3 0151
# define e_sub0 0152
# define e_sub3 0155
# define e_movec 0160
# define e_idn 0177
# define e_int 0176
# define e_string 0175
# define e_float 0174
# define e_call 0173
# define e_colon 0172
# define e_qmark 0171
# define e_eqi 0200
# define e_eqd 0206
# define e_eqp0 0214
# define e_gep3 0243
# define e_incb0 0260
/* STRUCTURES */
struct _token {int type,index,line;};
# define token struct _token


BIN
src/c/gt.stinkr Normal file

Binary file not shown.

282
src/c/h6000.gt Normal file
View File

@@ -0,0 +1,282 @@
typenames (char,int,float,double);
memnames (reg,auto,ext,stat,param,label,intlit,floatlit,string,
ix0,ix1,ix2,ix3,ix4,ia,iq);
regnames (x0,x1,x2,x3,x4,a,q,f);
size 1(char),4(int,float),8(double);
align 1(char),4(int,float),8(double);
class x(x0,x1,x2,x3,x4), r(a,q);
conflict (a,f),(q,f);
saveareasize 16;
pointer p0(1), p1(4);
offsetrange p1 (,);
returnreg q(char,int,p0,p1), f(double);
type int(r), char(r), float(f), double(f), p0(r), p1(x);
.sw: a,,1[x4];
+p0: -p0: +i:-i:&:^: .OR: -p0p0:<<: >>: r,M,1;
+p1: M,M,x; x,r,1; x,intlit,1;
-p1: x,r,1; x,intlit,1;
=+i: =&: =^: =OR: M,r,1;
*i: /i: q,M,q[a];
+d: -d: *d: /d: f,M,f;
%: q,M,a[q];
=<<: =>>: M,a,q; M,q,a;
&u0: auto|ext|stat|string|ia|iq,,r;
&u1: M,,x;
.BNOT: .ic: .ci: r,,1;
-ui: M,,r;
.cf: .cd: .if: .id: a,,f;
.fc: .dc: .fi: .di: f,,q;
.fd: M,,f;
.df: -ud: f,,1;
.ip0: .p0i: r,,1; M,,r;
.ip1: .p0p1: r,,x; M,,x;
.p1i: .p1p0: x,,r; M,,r;
++bi: M,,1;
++ai: M,,a[q];
M,,q[a];
++ap1: --ap1: M,M,x;
==i: !=i: <i: >i: <=i: >=i:
==p0: !=p0: <p0: >p0: <=p0: >=p0: r,M,M;
==d: !=d: <d: >d: <=d: >=d: f,M,M;
==p1: !=p1: <p1: >p1: <=p1: >=p1: x,M,M;
macros
+i: " AD#R #S"
-i: " SB#R #S"
*i: " MPY #S"
/i: %: " DIV #S"
+d: " DFAD #S"
-d: " DFSB #S"
*d: " DFMP #S"
/d: " DFDV #S"
=+i: " AS#S #R"
&: " AN#F #S"
=&: " ANS#S #F"
^: " ER#F #S"
=^: " ERS#S #F"
.OR: " OR#F #S"
=OR: " ORS#S #F"
>>:
(,intlit,): " #FRS %o(#'S)"
(,~intlit,): " LXL5 #S\n #FRS 0,5"
<<:
(,intlit,): " #FLS %o(#'S)"
(,~intlit,): " LXL5 #S\n #FLS 0,5"
=>>:
" LD#R #F
#RRS 0,#SL
ST#R #F"
=<<:
" LD#R #F
#RLS 0,#SL
ST#R #F"
+p0:
(,~intlit,): " #FRS 16\n AD#F #S\n #FLS 16"
(,intlit,): " ADL#R %co(#'S)"
-p0:
(,~intlit,): " #FRS 16\n SB#F #S\n #FLS 16"
(,intlit,): " SBL#R %co(#'S)"
+p1:
(M,M,): " LXL#R #S\n ADLX#R #F"
(x,r,): " #SLS 18\n ST#S .TEMP\n ADX#F .TEMP"
(x,intlit,): " EAX#R %o(#'S),#R"
-p1:
(,r,): " #SLS 18\n ST#S .TEMP\n SBX#F .TEMP"
(,intlit,): " EAX#R -%o(#'S),#R"
-ui: " LC#R #F"
-ud: " FNEG"
++bi: " AOS #F"
++ai: " LD#R #F\n AOS #F"
++ap1:
" LDX#R #F
EAX5 %o(#'S),#1
STX5 #F"
--ap1:
" LDX#R #F
EAX5 -%o(#'S),#1
STX5 #F"
.BNOT: " ER#F =-1"
&u0:
(ia|iq,,r):
"%if(%o(#'F), AD#F %co(#'F)\n,)\"
(ia,,q): " LLR 36"
(iq,,a): " LLR 36"
(auto|stat,,r):
" EA#R %n(#3,0)
%if(%o(#'F), AD#R %co(#'F)\n,)\"
(ext|string,,r):
" EA#R #F"
&u1: " EAX#R #F"
==i: " CMP#F #S\n TZE #R"
!=i: " CMP#F #S\n TNZ #R"
<i: " CMP#F #S\n TMI #R"
>i: " CMP#F #S\n TZE *+2\n TPL #R"
<=i: " CMP#F #S\n TZE #R\n TMI #R"
>=i: " CMP#F #S\n TPL #R"
==d: " DFCMP #S\n TZE #R"
!=d: " DFCMP #S\n TNZ #R"
<d: " DFCMP #S\n TMI #R"
>d: " DFCMP #S\n TZE *+2\n TPL #R"
<=d: " DFCMP #S\n TZE #R\n TMI #R"
>=d: " DFCMP #S\n TPL #R"
==p0: " CMP#F #S\n TZE #R"
!=p0: " CMP#F #S\n TNZ #R"
<p0: " CMP#F #S\n TZE *+2\n TNC #R"
>p0: " CMP#F #S\n TZE *+2\n TRC #R"
<=p0: " CMP#F #S\n TZE #R\n TNC #R"
>=p0: " CMP#F #S\n TRC #R"
==p1: " CMPX#F #S\n TZE #R"
!=p1: " CMPX#F #S\n TNZ #R"
<p1: " CMPX#F #S\n TZE *+2\n TNC #R"
>p1: " CMPX#F #S\n TZE *+2\n TRC #R"
<=p1: " CMPX#F #S\n TZE #R\n TNC #R"
>=p1: " CMPX#F #S\n TRC #R"
-p0p0: " SBL#F #S\n #FRL 16"
.cc:
(auto,,): " EA#R 0,7\n"
(stat,,): " EA#R .STAT\n"
(ia,,q): " STA .TEMP\n LDQ .TEMP\n"
(iq,,a): " STQ .TEMP\n LDA .TEMP\n"
(auto|stat|indirect,,):
"%if(%o(#'F), AD#R %co(#'F)\n,)\
TSX5 .CTO#R"
(ext|string,,): " LD#R #F\n #RRL 27"
(r,,r): " EA#R 0,#FL\n #RRL 18"
(r,,auto|stat|indirect|string):
" EAX5 0,#FL\n"
(r,,auto): " EA#F 0,7\n"
(r,,stat): " EA#F .STAT\n"
(r,,auto|stat):
"%if(%o(#'R), AD#F %co(#'R)\n,)\
TSX4 .#FTOC"
(r,,string): " EA#F #R\n TSX4 .#FTOC"
(r,,ext): " #FLS 27\n ST#F #R\n #FRL 27"
(q,,ia):
"%if(%o(#'R), ADA %co(#'R)\n,)\
TSX4 .ATOC"
(a,,iq):
"%if(%o(#'R), ADQ %co(#'R)\n,)\
TSX4 .QTOC"
.ii:
(r,,M): " ST#F #R"
(M,,r): " LD#R #F"
(r,,r): " LLR 36"
.ff:
(f,,M): " FSTR #R"
(M,,f): " FLD #F"
.dd:
(f,,M): " DPSTR #R"
(M,,f): " DPLD #F"
.p0p0:
(r,,r): " LLR 36"
(r,,M): " ST#F #R"
(M,,r): " LD#R #F"
.p1p1:
(x,,x): " EAX#R 0,#F"
(x,,M): " STZ #R\n STX#F #R"
(M,,x): " LDX#R #F"
(x,,q): " EAQ 0,#F"
(q,,x): " EAX#R 0,QU"
(M,,q): " LDQ #F"
(q,,M): " STQ #R"
.ci: "\"
.ic: " AN#F =O377,DL"
.p0p1: .ip1:
(r,,x): " EAX#R 0,#FU"
(M,,x): " LDX#R #F"
.p1p0: .p1i:
(x,,r): " EA#R 0,#F"
(M,,r): " LD#R #F"
.ip0: .p0i:
(M,,r): " LD#R #F"
(r,,r): "\"
.fd: " FLD #F"
.df: " FRD"
.cf: .cd: .if: .id:
" LDQ 0,DL
LDE =35B25,DU
FNO"
.fi: .di: " UFA =71B25,DU"
.fc: .dc:
" UFA =71B25,DU
ANQ =O377,DL"
hd:
"$ GMAP
SYMREF .PROLG,.EPILG,.TEMP,.LSIWT,.TSWIT
SYMREF .CTOA,.CTOQ,.ATOC,.QTOC"
en: " SYMDEF #0"
ex: " SYMREF #0"
st: ".I#0 EQU *"
rt: " TRA .EPILG"
go: " TRA #R"
l: ".L#0 EQU *"
lc: " ZERO .L#0"
p:
"*
* FUNCTION %m(#1)
*
%i(#1) TSX0 .PROLG
ZERO .FS#0"
ca:
" TSX1 #F
ZERO #1/4,#0"
ep:
" TRA .EPILG
.FS#0 EQU #1/4"
ls:
" TSX5 .LSWIT
ZERO #R,#0"
ts:
" TSX5 .TSWIT
ZERO #0,#5
TRA #R"
o: "#1"
co: "=V20/#1,16/0"
ln: "%flush().N#0 EQU *"
eq: "%flush()#0 EQU *"
in: "%flush() DEC #0"
ad0: ad1: "%flush() ZERO #R"
sc: "%flush() ZERO .S#0"
end: "%flush() END"
f: "%flush() DEC %ff(#0)"
nf: "%flush() DEC -%ff(#0)"
d: "%flush() DEC %dd(#0)"
nd: "%flush() DEC -%dd(#0)"
al1: "%flush()\"
al2: "%flush() EVEN"
im: da: pu: pd: "\"


234
src/c/pdp10.gt Normal file
View File

@@ -0,0 +1,234 @@
typenames (char, int, float, double);
regnames (a, c, d, b);
memnames (reg, auto, ext, stat, param, label, intlit, floatlit,
stringlit, ia, ic, id, ib);
size 1 (char, int, float, double);
align 1(char, int, float, double);
class r (a, b, c, d);
saveareasize 1;
pointer p0 (1);
offsetrange p0 (,);
returnreg a (int, double, p0);
type char(r), int(r), float(r), double(r), p0(r);
.sw: a|c|d,,1[b];
.argi: .argd: .arg0: r,,1; M,,1;
+i: *i: &: ^: .OR: +p0:
+d: *d: r,r,1; r,M,1; M,r,2;
-i: -p0: -p0p0: -d: /d: r,r,1; r,M,1;
/i: a,r,1[b]; b,r,1[c]; c,r,1[d];
a,M,1[b]; b,M,1[c]; c,M,1[d];
%: a,r,b; b,r,c; c,r,d;
a,M,b; b,M,c; c,M,d;
<<: >>: r,r,1; r,intlit,1;
=+i: =*i: =&: =^: =OR:
=+d: =*d: M,r,1; M,r,2;
.BNOT: -ui: -ud: r,,1; M,,r;
&u0:
++ai: ++ac: --ai: --ac: M,,r;
++ap0: --ap0: M,b,a|c|d; M,d,b;
++bi: ++bc:
--bi: --bc: M,,r; M,,1;
++bp0: --bp0: M,r,2;
.ic: .ci: .ip0: .p0i: .df: .fd:
.cf: .cd: .if: .id: r,,1;
.fc: .dc: .fi: .di: a,,b;
==p0: !=p0: <p0: >p0: <=p0: >=p0:
==i: !=i: <i: >i: <=i: >=i:
==d: !=d: <d: >d: <=d: >=d: r,r,label; r,M,label;
==0p0: !=0p0: r,,label; M,,label;
macros
+i: *i: &: ^: .OR: +p0:
(r,r,): " #O #F,#S"
(M,,): " #O #S,#F"
(r,~intlit,): " #O #F,#S"
(r,intlit,): " #O%ifm(#'S,I #F\,#6, #F\,#S)"
-i: /i: %: -p0: sb:
(,r,): " #O #F,#S"
(,~intlit,): " #O #F,#S"
(,intlit,): " #O%ifm(#'S,I #F\,#6, #F\,#S)"
+d: *d:
(r,,): " #O #F,#S"
(M,,): " #O #S,#F"
-d: /d: -p0p0:
" #O #F,#S"
<<:
(,intlit,): " LSH #R,#6"
(,r,): " LSH #R,(#S)"
>>:
(,intlit,): " LSH #R,-#6"
(,r,): " MOVN #S,#S\n LSH #R,(#S)"
=+i: " ADDB #S,#F"
=*i: " IMULB #S,#F"
=&: " ANDB #S,#F"
=^: " XORB #S,#F"
=OR: " IORB #S,#F"
=+d: " FADRB #S,#F"
=*d: " FMPRB #S,#F"
&u0: " MOVEI #R,#F"
++ai: ++ac: " MOVE #R,#F\n AOS #F"
--ai: --ac: " MOVE #R,#F\n SOS #F"
++bi: ++bc:
(,,r): " MOVEI #R,1\n ADDB #R,#F"
(,,M): " AOS #F"
--bi: --bc:
(,,r): " SETO #R,\n ADDB #R,#F"
(,,M): " SOS #F"
++ap0: " MOVE #R,#F\n ADDM #S,#F"
--ap0: " MOVE #R,#F\n MOVN #S,#S\n ADDM #S,#F"
++bp0: " ADDB #S,#F"
--bp0: " MOVN #S,#S\n ADDB #S,#F"
.BNOT:
(r,,): " SETCA #R,"
(M,,): " SETCM #R,#F"
-ui: -ud: " MOVN #R,#F"
==p0: " CAMN #F,#S\n GO #R"
!=p0: " CAME #F,#S\n GO #R"
<p0: " CAMGE #F,#S\n GO #R"
>p0: " CAMLE #F,#S\n GO #R"
<=p0: " CAMG #F,#S\n GO #R"
>=p0: " CAML #F,#S\n GO #R"
==i: "%ifm(#'S,%if(#6,\tCAIN\t#F\,#6\n\tGO\t#R,\tJUMPE\t#F\,#R),\tCAMN\t#F\,#S\n\tGO\t#R)"
!=i: "%ifm(#'S,%if(#6,\tCAIE\t#F\,#6\n\tGO\t#R,\tJUMPN\t#F\,#R),\tCAME\t#F\,#S\n\tGO\t#R)"
<i: "%ifm(#'S,%if(#6,\tCAIGE\t#F\,#6\n\tGO\t#R,\tJUMPL\t#F\,#R),\tCAMGE\t#F\,#S\n\tGO\t#R)"
>i: "%ifm(#'S,%if(#6,\tCAILE\t#F\,#6\n\tGO\t#R,\tJUMPG\t#F\,#R),\tCAMLE\t#F\,#S\n\tGO\t#R)"
<=i: "%ifm(#'S,%if(#6,\tCAIG\t#F\,#6\n\tGO\t#R,\tJUMPLE\t#F\,#R),\tCAMG\t#F\,#S\n\tGO\t#R)"
>=i: "%ifm(#'S,%if(#6,\tCAIL\t#F\,#6\n\tGO\t#R,\tJUMPGE\t#F\,#R),\tCAML\t#F\,#S\n\tGO\t#R)"
==d: " FSBR #F,#S\n JUMPE #F,#R"
!=d: " FSBR #F,#S\n JUMPN #F,#R"
<d: " FSBR #F,#S\n JUMPL #F,#R"
>d: " FSBR #F,#S\n JUMPG #F,#R"
<=d: " FSBR #F,#S\n JUMPLE #F,#R"
>=d: " FSBR #F,#S\n JUMPGE #F,#R"
==0p0:
(M,,): " SKIPN #F\n GO #R"
(r,,): " JUMPE #F,#R"
!=0p0:
(M,,): " SKIPE #F\n GO #R"
(r,,): " JUMPN #F,#R"
.cc: .ii:
.ff: .dd:
.p0p0:
(r,,r): " MOVE #R,#F"
(r,,M): " MOVEM #F,#R"
(~intlit,,r): " MOVE #R,#F"
(intlit,,r): " %ifm(#'F,MOVEI\t#R\,#4,%ifm(#3,-#4,MOVNI\t#R\,-#4,MOVE\t#R\,#F))"
.if: .id:
.cf: .cd: " FSC #R,155"
.di: .dc:
.fi: .fc: " JSP 0,FIXIFY"""
.ic: .ci:
.ip0: .p0i:
.df: .fd: "\"
.argi:
.argd:
.arg0: " PPUSH #F"
in: c: " #0"
ad0: " #R"
al: "\"
ca: " CCALL #0,#F"
end:
".PDATA
CONSTANTS
END"
en: " ENTRY #0"
ex: " EXTERN #0"
eq: "#0:"
go: " GO #R"
hd:
" TITLE %pname()
RADIX 10.
.INSRT C;NC INSERT
"
ln: "\n; LINE #0\n"
p:
"%setfno(#0)
\%A==#2
\%A,,[ASCIZ/%m(#1)/]
%i(#1): ADDI P,FS#0"
rt:
" SUBI P,FS#0+\%A+1
GO @<\%A+1>(P)"
ep:
" SUBI P,FS#0+\%A+1
GO @<\%A+1>(P)
FS#0==#1-1"
st: "I#0:"
z: " BLOCK #0"
f: d: " %ff(#0)"
nf: nd: " -%ff(#0)"
ts:
"%if(#0,%sb(68,#'F,#'F,-6,#0)
,) JUMPL #F,#R
CAILE #F,#5-#0
GO #R
GO @(#F)["
ets: " ]"
ls:
" MOVE B,[-#0,,["
els:
" ]]
CAMN #F,(B)
GO @#0(B)
AOBJN B,.-2
GO #R"
lc: " L#0"
l: "L#0:"
sc: " S#0"
pu: ".CODE"
pd: ".PDATA"
im: ".UDATA"
da: ".IDATA"


285
src/c/pdp11.gt Normal file
View File

@@ -0,0 +1,285 @@
typenames (char, int, float, double);
regnames (r0, r2, r3, r1, fr0, fr1, fr2, fr3);
memnames (reg, auto, ext, stat, param, label, intlit, floatlit,
stringlit, ir0, ir2, ir3, ir1);
size 1 (char), 2 (int, float), 4 (double);
align 1 (char), 2 (int, float), 4 (double);
class r (r0, r1, r2, r3), f (fr0, fr1, fr2, fr3);
saveareasize 0;
pointer p0 (1);
offsetrange p0 (,);
returnreg r0 (int, p0), fr0 (double);
type char(r), int(r), float(f), double(f), p0(r);
.sw: r0|r2,,1[r1,r3];
+i: &: .OR: +p0: r,r,1; r,M,1; M,r,2;
-i: -p0: -p0p0: <<: >>: r,r,1; r,M,1;
*i: r1,r,r1;
r3,r,r3;
r1,M,r1;
r3,M,r3;
r0,r,r1[r0];
r2,r,r3[r2];
r0,M,r1[r0];
r2,M,r3[r2];
/i: r1,r2|r3,r0[r1];
r3,r0|r1,r2[r3];
r1,M,r0[r1];
r3,M,r2[r3];
%: r1,r2|r3,r1[r0];
r3,r0|r1,r3[r2];
r1,M,r1[r0];
r3,M,r3[r1];
^: r,r,1;
+d: *d: f,f,1; f,M,1; M,f,2;
-d: /d: f,f,1; f,M,1;
=+i: =-i: =&: =OR:
++bp0: --bp0: M,r,1; M,M,1;
=^: M,r,1;
.BNOT: -ui: r,,1;
-ud: f,,1;
&u0: M,,r;
++ai: ++ac: --ai: --ac: M,,r;
++ap0: --ap0: M,r,r; M,M,r;
++bi: ++bc:
--bi: --bc: M,,1;
.ic: .ci: .ip0: .p0i: r,,1;
.df: .fd: f,,1;
.cf: .cd: r,,f;
.if: .id: r,,f; M,,f;
.fc: .dc: .fi: .di: f,,r;
==p0: !=p0: <p0: >p0: <=p0: >=p0:
==i: !=i: <i: >i: <=i: >=i: r,r,label;
r,M,label;
M,r,label;
M,M,label;
==d: !=d: <d: >d: <=d: >=d: f,f,label; M,f,label;
macros
+i: .OR: +p0: +d: *d:
(r|f,,): " #O #S,#F"
(M,,): " #O #F,#S"
-i: -p0: -p0p0: sb: ^: *i: -d: /d:
" #O #S,#F"
/i: %:
" tst #F
sxt #F-1
#O #S,#F-1"
&:
(r,,):
" mov #S,-(sp)
com (sp)
bic (sp)+,#F"
(M,,):
" mov #F,-(sp)
com (sp)
bic (sp)+,#S"
<<: " ash #S,#F"
>>:
(,intlit,): " ash \#-#6.,#F"
(,~intlit,):
" mov #S,-(sp)
neg (sp)
ash (sp)+,#F"
=+i: ++bp0: " add #S,#F"
=-i: --bp0: " sub #S,#F"
=OR: " bis #S,#F"
=^: " xor #S,#F"
=&:
" mov #S,-(sp)
com (sp)
bic (sp)+,#F"
.BNOT: -ui: -ud:
" #O #R"
&u0:
(auto,,):
" mov sp,#R
add \##4.,#R"
(ext|stat|label|stringlit,,):
" mov \##F,#R"
(param,,):
" mov r4,#R
add \##4.,#R"
++ai:
" mov #F,#R
inc #F"
++ac:
" movb #F,#R
incb #F"
--ai:
" mov #F,#R
dec #F"
--ac:
" movb #F,#R
decb #F"
++ap0:
" mov #F,#R
add #S,#F"
--ap0:
" mov #F,#R
sub #S,#F"
++bi: " inc #R"
--bi: " dec #R"
++bc: " incb #R"
--bc: " decb #R"
.ic:
.ip0: .p0i:
.df: .fd: "\"
.ci: " bic \#177400,#R"
.cf: .cd:
" bic \#177400,#F
ldcid #F,#R"
.if: .id: " ldcid #F,#R"
.fi: .di:
.fc: .dc: " stcdi #F,#R"
==i: !=i: <i: >i: <=i: >=i:
" cmp #F,#S
%bc(#'O) .+6
jmp #R"
==d: !=d: <d: >d: <=d: >=d:
" cmpd #F,#S
%bc(#'O) .+6
jmp #R"
==p0: !=p0: <p0: >p0: <=p0: >=p0:
" cmp #F,#S
%ubc(#'O) .+6
jmp #R"
.cc: " movb #F,#R"
.ii: .p0p0: " mov #F,#R"
.ff:
(f,,f): " ldd #F,#R"
(M,,f): " ldcfd #F,#R"
(f,,M): " stcdf #F,#R"
.dd:
(,,f): " ldd #F,#R"
(,,M): " std #F,#R"
in: " #0."
ad0: " #R"
c: " .byte #0."
ca:
" jsr r5,#F
#1.
#0."
end: ".end"
en: ex: ".globl #0"
ep:
" jmp epilog
fs#0=#1."
eq: "#0:"
go: " jmp #R"
hd:
".title %pname()
.insrt c;c11 insert
"
ln: "\n; line #0\n"
p:
"
%i(#1): jsr r0,prolog
fs#0"
rt: " jmp epilog"
st: "i#0:"
z: " .blkb #0."
f: d: " %ff(#0)"
nf: nd: " -%ff(#0)"
ts:
"%if(#0,%sb(68,#'F,#'F,-6,#0)
,) tst #F
bge .+6
jmp #R
cmp #F,\#<#5.-#0.>
bgt .+8.
asl #F
jmp @<.+8.>(#F)
jmp #R"
ls:
" mov \##0.,r1
mov \#.+18.,r3
cmp #F,(r3)+
bne .+6
jmp @2*#0.-2(r3)
sob r1,.-8.
jmp #R"
lc: " l#0"
l: "l#0:"
sc: " s#0"
pu: pd: ".text"
da: ".data"
im: ".bss"


234
src/c/pdp20.gt Normal file
View File

@@ -0,0 +1,234 @@
typenames (char, int, float, double);
regnames (a, c, d, b);
memnames (reg, auto, ext, stat, param, label, intlit, floatlit,
stringlit, ia, ic, id, ib);
size 1 (char, int, float, double);
align 1(char, int, float, double);
class r (a, b, c, d);
saveareasize 1;
pointer p0 (1);
offsetrange p0 (,);
returnreg a (int, double, p0);
type char(r), int(r), float(r), double(r), p0(r);
.sw: a|c|d,,1[b];
.argi: .argd: .arg0: r,,1; M,,1;
+i: *i: &: ^: .OR: +p0:
+d: *d: r,r,1; r,M,1; M,r,2;
-i: -p0: -p0p0: -d: /d: r,r,1; r,M,1;
/i: a,r,1[b]; b,r,1[c]; c,r,1[d];
a,M,1[b]; b,M,1[c]; c,M,1[d];
%: a,r,b; b,r,c; c,r,d;
a,M,b; b,M,c; c,M,d;
<<: >>: r,r,1; r,intlit,1;
=+i: =*i: =&: =^: =OR:
=+d: =*d: M,r,1; M,r,2;
.BNOT: -ui: -ud: r,,1; M,,r;
&u0:
++ai: ++ac: --ai: --ac: M,,r;
++ap0: --ap0: M,b,a|c|d; M,d,b;
++bi: ++bc:
--bi: --bc: M,,r; M,,1;
++bp0: --bp0: M,r,2;
.ic: .ci: .ip0: .p0i: .df: .fd:
.cf: .cd: .if: .id: r,,1;
.fc: .dc: .fi: .di: a,,b;
==p0: !=p0: <p0: >p0: <=p0: >=p0:
==i: !=i: <i: >i: <=i: >=i:
==d: !=d: <d: >d: <=d: >=d: r,r,label; r,M,label;
==0p0: !=0p0: r,,label; M,,label;
macros
+i: *i: &: ^: .OR: +p0:
(r,r,): " #O #F,#S"
(M,,): " #O #S,#F"
(r,~intlit,): " #O #F,#S"
(r,intlit,): " #O%ifm(#'S,I #F\,#6, #F\,#S)"
-i: /i: %: -p0: sb:
(,r,): " #O #F,#S"
(,~intlit,): " #O #F,#S"
(,intlit,): " #O%ifm(#'S,I #F\,#6, #F\,#S)"
+d: *d:
(r,,): " #O #F,#S"
(M,,): " #O #S,#F"
-d: /d: -p0p0:
" #O #F,#S"
<<:
(,intlit,): " LSH #R,#6"
(,r,): " LSH #R,(#S)"
>>:
(,intlit,): " LSH #R,-#6"
(,r,): " MOVN #S,#S\n LSH #R,(#S)"
=+i: " ADDB #S,#F"
=*i: " IMULB #S,#F"
=&: " ANDB #S,#F"
=^: " XORB #S,#F"
=OR: " IORB #S,#F"
=+d: " FADRB #S,#F"
=*d: " FMPRB #S,#F"
&u0: " MOVEI #R,#F"
++ai: ++ac: " MOVE #R,#F\n AOS #F"
--ai: --ac: " MOVE #R,#F\n SOS #F"
++bi: ++bc:
(,,r): " MOVEI #R,1\n ADDB #R,#F"
(,,M): " AOS #F"
--bi: --bc:
(,,r): " SETO #R,\n ADDB #R,#F"
(,,M): " SOS #F"
++ap0: " MOVE #R,#F\n ADDM #S,#F"
--ap0: " MOVE #R,#F\n MOVN #S,#S\n ADDM #S,#F"
++bp0: " ADDB #S,#F"
--bp0: " MOVN #S,#S\n ADDB #S,#F"
.BNOT:
(r,,): " SETCA #R,"
(M,,): " SETCM #R,#F"
-ui: -ud: " MOVN #R,#F"
==p0: " CAMN #F,#S\n GO #R"
!=p0: " CAME #F,#S\n GO #R"
<p0: " CAMGE #F,#S\n GO #R"
>p0: " CAMLE #F,#S\n GO #R"
<=p0: " CAMG #F,#S\n GO #R"
>=p0: " CAML #F,#S\n GO #R"
==i: "%ifm(#'S,%if(#6,\tCAIN\t#F\,#6\n\tGO\t#R,\tJUMPE\t#F\,#R),\tCAMN\t#F\,#S\n\tGO\t#R)"
!=i: "%ifm(#'S,%if(#6,\tCAIE\t#F\,#6\n\tGO\t#R,\tJUMPN\t#F\,#R),\tCAME\t#F\,#S\n\tGO\t#R)"
<i: "%ifm(#'S,%if(#6,\tCAIGE\t#F\,#6\n\tGO\t#R,\tJUMPL\t#F\,#R),\tCAMGE\t#F\,#S\n\tGO\t#R)"
>i: "%ifm(#'S,%if(#6,\tCAILE\t#F\,#6\n\tGO\t#R,\tJUMPG\t#F\,#R),\tCAMLE\t#F\,#S\n\tGO\t#R)"
<=i: "%ifm(#'S,%if(#6,\tCAIG\t#F\,#6\n\tGO\t#R,\tJUMPLE\t#F\,#R),\tCAMG\t#F\,#S\n\tGO\t#R)"
>=i: "%ifm(#'S,%if(#6,\tCAIL\t#F\,#6\n\tGO\t#R,\tJUMPGE\t#F\,#R),\tCAML\t#F\,#S\n\tGO\t#R)"
==d: " FSBR #F,#S\n JUMPE #F,#R"
!=d: " FSBR #F,#S\n JUMPN #F,#R"
<d: " FSBR #F,#S\n JUMPL #F,#R"
>d: " FSBR #F,#S\n JUMPG #F,#R"
<=d: " FSBR #F,#S\n JUMPLE #F,#R"
>=d: " FSBR #F,#S\n JUMPGE #F,#R"
==0p0:
(M,,): " SKIPN #F\n GO #R"
(r,,): " JUMPE #F,#R"
!=0p0:
(M,,): " SKIPE #F\n GO #R"
(r,,): " JUMPN #F,#R"
.cc: .ii:
.ff: .dd:
.p0p0:
(r,,r): " MOVE #R,#F"
(r,,M): " MOVEM #F,#R"
(~intlit,,r): " MOVE #R,#F"
(intlit,,r): " %ifm(#'F,MOVEI\t#R\,#4,%ifm(#3,-#4,MOVNI\t#R\,-#4,MOVE\t#R\,#F))"
.if: .id:
.cf: .cd: " FSC #R,155"
.di: .dc:
.fi: .fc: " JSP 0,FIXIFY"""
.ic: .ci:
.ip0: .p0i:
.df: .fd: "\"
.argi:
.argd:
.arg0: " PPUSH #F"
in: c: " #0"
ad0: " #R"
al: "\"
ca: " CCALL #0,#F"
end:
".PDATA
CONSTANTS
END"
en: " ENTRY #0"
ex: " EXTERN #0"
eq: "#0:"
go: " GO #R"
hd:
" TITLE %pname()
RADIX 10.
.INSRT <C>NC
"
ln: "\n; LINE #0\n"
p:
"%setfno(#0)
\%A==#2
\%A,,[ASCIZ/%m(#1)/]
%i(#1): ADDI P,FS#0"
rt:
" SUBI P,FS#0+\%A+1
GO @<\%A+1>(P)"
ep:
" SUBI P,FS#0+\%A+1
GO @<\%A+1>(P)
FS#0==#1-1"
st: "I#0:"
z: " BLOCK #0"
f: d: " %ff(#0)"
nf: nd: " -%ff(#0)"
ts:
"%if(#0,%sb(68,#'F,#'F,-6,#0)
,) JUMPL #F,#R
CAILE #F,#5-#0
GO #R
GO @(#F)["
ets: " ]"
ls:
" MOVE B,[-#0,,["
els:
" ]]
CAMN #F,(B)
GO @#0(B)
AOBJN B,.-2
GO #R"
lc: " L#0"
l: "L#0:"
sc: " S#0"
pu: ".CODE"
pd: ".PDATA"
im: ".UDATA"
da: ".IDATA"


340
src/c/unix.gt Normal file
View File

@@ -0,0 +1,340 @@
typenames (char, int, float, double);
regnames (r0, r2, r3, r1, fr0, fr1, fr2, fr3);
memnames (reg, auto, ext, stat, param, label, intlit, floatlit,
stringlit, ir0, ir2, ir3, ir1);
size 1 (char), 2 (int), 4 (float), 8 (double);
align 1 (char), 2 (int, float, double);
class r (r0, r1, r2, r3), f (fr0, fr1, fr2, fr3);
saveareasize 0;
pointer p0 (1);
offsetrange p0 (,);
returnreg r0 (int, p0), fr0 (double);
type char(r), int(r), float(f), double(f), p0(r);
.sw: r0|r2,,1[r1,r3];
+i: &: .OR: +p0: r,r,1; r,M,1; M,r,2;
-i: -p0: -p0p0: <<: >>: r,r,1; r,M,1;
*i: r1,r,r1;
r3,r,r3;
r1,M,r1;
r3,M,r3;
r0,r,r1[r0];
r2,r,r3[r2];
r0,M,r1[r0];
r2,M,r3[r2];
/i: r1,r2|r3,r0[r1];
r3,r0|r1,r2[r3];
r1,M,r0[r1];
r3,M,r2[r3];
%: r1,r2|r3,r1[r0];
r3,r0|r1,r3[r2];
r1,M,r1[r0];
r3,M,r3[r1];
^: r,r,1;
+d: *d: f,f,1; f,~floatlit,1; ~floatlit,f,2;
-d: /d: f,f,1; f,~floatlit,1;
=+i: =-i: =&: =OR:
++bp0: --bp0: M,r,1; M,M,1;
=^: M,r,1;
.BNOT: -ui: r,,1;
-ud: f,,1;
&u0: M,,r;
++ai: ++ac: --ai: --ac: M,,r;
++ap0: --ap0: M,r,r; M,M,r;
++bi: ++bc:
--bi: --bc: M,,1;
.ic: .ci: .ip0: .p0i: r,,1;
.df: .fd: f,,1;
.cf: .cd: r,,f;
.if: .id: r,,f; M,,f;
.fc: .dc: .fi: .di: f,,r;
==p0: !=p0: <p0: >p0: <=p0: >=p0:
==i: !=i: <i: >i: <=i: >=i: r,r,label;
r,M,label;
M,r,label;
M,M,label;
==d: !=d: <d: >d: <=d: >=d: f,f,label; ~floatlit,f,label;
macros
+i: .OR: +p0: +d: *d:
(r|f,,): " #O #S,#F"
(M,,): " #O #F,#S"
-i: -p0: -p0p0: sb: ^: *i: -d: /d:
" #O #S,#F"
/i: %:
" tst #F
sxt #F-1
#O #S,#F-1"
&:
(r,,):
" mov #S,-(sp)
com (sp)
bic (sp)+,#F"
(M,,):
" mov #F,-(sp)
com (sp)
bic (sp)+,#S"
<<: " ash #S,#F"
>>:
(,intlit,): " ash $-#6.,#F"
(,~intlit,):
" mov #S,-(sp)
neg (sp)
ash +(sp),#F"
=+i: ++bp0: " add #S,#F"
=-i: --bp0: " sub #S,#F"
=OR: " bis #S,#F"
=^: " xor #S,#F"
=&:
" mov #S,-(sp)
com (sp)
bic (sp)+,#F"
.BNOT: -ui: -ud:
" #O #R"
&u0:
(auto,,):
" mov sp,#R
add $#4.,#R"
(ext|stat|label|stringlit,,):
" mov $#F,#R"
(param,,):
" mov r4,#R
add $#4.,#R"
++ai:
" mov #F,#R
inc #F"
++ac:
" movb #F,#R
incb #F"
--ai:
" mov #F,#R
dec #F"
--ac:
" movb #F,#R
decb #F"
++ap0:
" mov #F,#R
add #S,#F"
--ap0:
" mov #F,#R
sub #S,#F"
++bi: " inc #R"
--bi: " dec #R"
++bc: " incb #R"
--bc: " decb #R"
.ic:
.ip0: .p0i:
.df: .fd: "\"
.ci: " bic $177400,#R"
.cf: .cd:
" bic $177400,#F
movif #F,#R"
.if: .id: " movif #F,#R"
.fi: .di:
.fc: .dc: " movfi #F,#R"
==i:
==p0:
" cmp #F,#S
jeq #R"
!=i:
!=p0:
" cmp #F,#S
jne #R"
<i:
" cmp #F,#S
jlt #R"
>i:
" cmp #F,#S
jgt #R"
<=i:
" cmp #F,#S
jle #R"
>=i:
" cmp #F,#S
jge #R"
==d:
" cmpf #F,#S
jeq #R"
!=d:
" cmpf #F,#S
jne #R"
<d:
" cmpf #F,#S
jlt #R"
>d:
" cmpf #F,#S
jgt #R"
<=d:
" cmpf #F,#S
jle #R"
>=d:
" cmpf #F,#S
jge #R"
<p0:
" cmp #F,#S
jlo #R"
>p0:
" cmp #F,#S
jhi #R"
<=p0:
" cmp #F,#S
jlos #R"
>=p0:
" cmp #F,#S
jhis #R"
.cc: " movb #F,#R"
.ii: .p0p0: " mov #F,#R"
.ff:
(f,,f): " movf #F,#R"
(M,,f): " movof #F,#R"
(f,,M): " movfo #F,#R"
.dd:
(~floatlit,,f): " movf #F,#R"
(,,M): " movf #F,#R"
(floatlit,,f):
" movf 0f,#R
.data
0: %ff(#4)
.text"
in: " #0."
ad0: " #0"
c: " .byte #0."
al: ".even"
ca: " jsr r5,#F; #1.; #0."
end: "\"
en: ex: ".globl #0"
ep:
" jmp epilog
fs#0=#1."
eq: "#0:"
go: " jbr #R"
hd: ".globl prolog,epilog"
ln: "\n/ line #0\n"
p: "\n%i(#1): jsr r0,prolog; fs#0"
rt: " jmp epilog"
st: "i#0:"
z: ".=.+#0."
f: d: " %ff(#0)"
nf: nd: " %nff(#0)"
ts:
"%if(#0,%sb(68,#'F,#'F,-6,#0)
,) cmp #F,$#5.-[#0.]
jhi #R
asl #F
jmp *0f(#F)
0:"
ls:
" mov $#0.,r1
mov $0f,r3
2: cmp #F,(r3)+
beq 1f
sob r1,2b
jbr #R
1: jmp *2*#0.-2(r3)
0:"
lc: " l#0"
l: "l#0:"
sc: " s#0"
pu: pd: ".text"
da: ".data"
im: ".bss"


535
src/c/yparse.c Normal file
View File

@@ -0,0 +1,535 @@
/*
PARSING ROUTINE (for use with CC & OYACC)
Requires the following:
the tables produced by YACC
GETTOK - a lexical routine
PTOKEN - a token printing routine
a set of error message routines (one such set is
contained in the file YERROR >)
Returns TRUE if a fatal syntax error occured.
*/
struct _token { int type, index, line; };
# define token struct _token
token *dmperr(),*lex(),*tok(),*ctok(),*yreset();
# define pssize 200
# define tbsize 30
# define FALSE 0
# define TRUE 1
extern int cout;
/* GLOBAL VARIABLES USED TO RECEIVE INFO FROM GETTOK */
int lextype; /* indicates which terminal symbol read */
int lexindex; /* used as translation element */
int lexline; /* line-number of line which token appears on */
/* GLOBAL VARIABLES WHICH MAY BE SET TO INDICATE OPTIONS */
int debug FALSE; /* nonzero => print debugging info */
int edebug FALSE; /* nonzero => print error recovery info */
int xflag FALSE; /* nonzero => do not call action routines */
int tflag FALSE; /* nonzero => print tokens as read */
/* GLOBAL VARIABLES REFERENCED BY ACTION ROUTINES */
int val; /* set to indicate translation element of LHS */
int line; /* set to indicate line number of LHS */
int *pv; /* used to reference translations of RHS */
int *pl; /* used to reference line numbers of RHS */
int lineno; /* used to reference lineno of current token */
/* INTERNAL STATIC VARIABLES */
static int *ps; /* parser stack pointer - states */
static int s[pssize]; /* parser stack - states */
static int v[pssize]; /* parser stack - translation elements */
static int l[pssize]; /* parser stack - line numbers */
static int *sps; /* save stack pointer - states*/
static int *spv; /* save stack pointer - translation elements */
static int *spl; /* save stack pointer - line numbers */
static int ss[pssize]; /* save stack - states */
static int sv[pssize]; /* save stack - translation elements */
static int sl[pssize]; /* save stack - line numbers */
static int must 7; /* number of tokens which must shift
correctly before error recovery is
considered successful */
static int errcount 0; /* number of tokens left until successful */
static int tskip; /* number of tokens skipped */
static int spop; /* number of states popped */
static int errmode 0; /* error recovery mode */
static int tabmod FALSE; /* indicates index tables have been optimized */
/**********************************************************************
PARSE - THE PARSER ITSELF
**********************************************************************/
parse()
{extern int (*act[])(), g[], pg[], r1[], r2[], a[], pa[], nwpbt;
int ac, op, n, state, *ap, *gp, control, i, r,
tlimit, slimit, *p, *ip, o, (*fp)(), t, errn;
token *ct, *tp;
ps = &s[0];
pv = &v[0];
pl = &l[0];
state = 1;
*ps = 1;
*pv = 0;
*pl = 0;
ct = lex();
if (!tabmod)
{ /* precompute index tables into action
and goto arrays */
ip = pa;
while ((o = *++ip) != -1) *ip = &a[o];
ip = pg;
while ((o = *++ip) != -1) *ip = &g[o];
tabmod = TRUE;
}
while (TRUE)
{ap = pa[state];
if (debug)
cprint("executing state %d, token=%d\n",state, ct->type);
while (TRUE)
{ac = *ap++;
op = ac>>12;
n = ac&07777;
switch (op) {
case 1: /* SKIP ON TEST */
if (ct->type!=n) ++ap;
continue;
case 2: /* SHIFT INPUT SYMBOL */
state = n;
shift: val = ct->index;
line = ct->line;
ct = lex();
if (errcount)
{--errcount;
if (errcount==0) /* successful recovery */
{ct = dmperr(); /* list recovery actions */
control = 0;
break;
}
}
control=1; /* stack new state */
break;
case 3: /* MAKE A REDUCTION */
if (debug) cprint ("reduce %d\n",n);
r = r2[n];
ps =- r;
pv =- r;
pl =- r;
if (r>0)
{val = pv[1];
line = pl[1];
}
else
{val = ct->index;
line = ct->line;
}
if (!xflag && (fp = act[n])) (*fp)();
state = *ps;
gp= pg[r1[n]];
while (*gp)
{if (*gp==state) break;
gp=+2;
}
state = *++gp;
control = 1; /* stack new state */
break;
case 5: /* SHIFT ON MASK */
t = ct->type;
if (ap[t>>4] & (1<<(t&017))) /* bit on */
{state = *(a+n+t-1);
goto shift;
}
ap =+ nwpbt; /* skip over bit array */
continue;
case 4: /* ACCEPT INPUT */
if (errmode)
{ct = dmperr();
control = 0;
break;
}
return (FALSE);
case 0: /* SYNTAX ERROR */
/* The error recovery method used is to try skipping input symbols
and popping states off the stack in all possible combinations,
subject to a limitation on the number of symbols which may be
skipped. If a combination can be found which allows parsing
to continue for at least 7 more symbols, then the recovery is
considered a success. If no such combination can be found, the
parser gives up.
In running through the possible recovery actions, skipping
input symbols is given priority over popping states, since
popping states tends to confuse the action routines, while
skipping symbols can not have any harmful effects on the
action routines.
While searching for a successful combination of states and
symbols, the action routines are not called. When a successful
combination is found, the appropriate error messages are
written, the action routines are turned back on, and the parser
is reset at the point where the corrections have just been made.
*/
switch (errmode) {
case 0: /* NEW ERROR */
if (edebug) cprint("errmode=0:st=%d,nst=%d,tok=%d\n",
state,ps-s,ct->type);
synerr (ct->line); /* report syntax error */
p=s;
while (p<=ps) qprint (*p++);
pcursor ();
tkeem(); /* enter error mode to save tokens */
for (i=0;i<5;++i)
{tp = tok(i);
if (tp->type==1) break;
tprint (tp);
}
save(); /* save parser stack */
errcount = must;
errmode = 1;
xflag =| 2; /* turn off action routnes */
/* set up limits for recovery search */
tlimit = tbsize - must - 2;
slimit = ps-s;
tskip = 0;
spop = 0;
errn = 1;
case 1: /* try next recovery attempt */
restore();
yreset();
if ((++tskip & 1) == 0) --spop;
if (spop<0 || ct->type==1 || tskip>tlimit)
{spop = errn++;
tskip = 0;
}
if (spop <= slimit)
{ct = ctok(tskip);
control = -spop;
break;
}
giveup (ct->line); /* give up */
return (TRUE);
}
if (edebug) cprint ("spop=%d,tskip=%d,token=%d\n",
spop,tskip,ct->type);
break;
}
if (control>0)
{if (debug) cprint ("stack st=%d val=%d\n",state,val);
*++ps = state;
*++pv = val;
*++pl = line;
if (ps-s>=pssize) /* stack overflow */
{stkovf (ct->line);
return (TRUE);
}
}
else if (control<0)
{pv =+ control;
ps =+ control;
pl =+ control;
if (ps<s) /* stack underflow */
{stkunf (ct->line);
return (TRUE);
}
}
state = *ps;
break;
}
}
}
/**********************************************************************
DMPERR - PRINT ERROR RECOVERY ACTION TAKEN
RESET PARSER TO RESTART WITH ACTION ROUTINES
RETURN PTR TO NEW CURRENT TOKEN
**********************************************************************/
token *dmperr()
{int i;
token *tp;
extern token *ct;
yreset();
restore();
if (spop>0) delmsg (ct->line); /* print DELETED: */
for (i=1;i<=spop;++i)
qprint (ps[-spop+i]); /* print symbol associated with state */
if (tskip>0) skpmsg (ct->line);
for(i=0;i<tskip;++i)
tprint ( tok(i)); /* print token skipped */
xflag =& ~02;
errmode = 0;
errcount = 0;
ps =- spop;
pv =- spop;
pl =- spop;
tp = ctok (tskip);
tklem(); /* leave error mode */
return (tp);
}
/**********************************************************************
SAVE - SAVE PARSER STACK
**********************************************************************/
save()
{int *p1,*p2;
p1=s;
p2=ss;
do *p2++ = *p1++; while (p1 <= ps);
p1=v;
p2=sv;
do *p2++ = *p1++; while (p1 <= pv);
p1=l;
p2=sl;
do *p2++ = *p1++; while (p1 <= pl);
sps=ps;
spv=pv;
spl=pl;
}
/**********************************************************************
RESTORE - RESTORE PARSER STACK
**********************************************************************/
restore()
{int *p1,*p2;
ps=sps;
pv=spv;
pl=spl;
p1=s;
p2=ss;
do *p1++ = *p2++; while (p1 <= ps);
p1=v;
p2=sv;
do *p1++ = *p2++; while (p1 <= pv);
p1=l;
p2=sl;
do *p1++ = *p2++; while (p1 <= pl);
errcount=must;
}
/**********************************************************************
PARSER TOKEN CLUSTER
There are two modes of operation:
1. Normal mode, in which only the current token
is remembered.
2. Error mode, in which all tokens seen are remembered
(up to a limit).
OPERATIONS:
lex() Return a pointer to the next token in the input
stream and make it the current token.
tok(i) In error mode, return a pointer to the i-th token
relative to the current token in the input stream.
ctok(i) Same as tok(i), except the selected token becomes
the current token.
yreset() In error mode, adjust the input stream so that
the current token is that which was current when
error mode was entered, and return a pointer
to it.
tkeem() Enter error mode.
tklem() Leave error mode.
**********************************************************************/
token tokbuf [tbsize]; /* token buffer, for error mode */
token *ct tokbuf; /* current token pointer */
token *twp tokbuf; /* pointer to next available position
in token buffer */
int tokmode 0; /* Normal or Error mode */
token *lex()
{if (++ct >= twp)
/* If true, it is neccessary to read in another token.
If in normal mode, place the token in the first
element of the buffer.
*/
{if (tokmode==0) ct=twp=tokbuf;
else
{if (twp>=tokbuf+tbsize) tkbovf (ct->line);
if (ct>twp) badtwp (ct->line);
}
rtoken (twp++); /* read token into next slot */
}
if (tflag && !tokmode)
{ptoken (ct, cout);
cputc (' ', cout);
}
lineno = ct->line;
return (ct); /* return ptr to token read */
}
token *tok(i)
{token *p;
p = ct + i;
if (p<tokbuf || p>=tokbuf+tbsize) badtok (ct->line, i);
while (p>=twp) rtoken (twp++);
return (p);
}
token *ctok(i)
{return (ct = tok(i));}
token *yreset()
{return (ct = tokbuf);}
tkeem()
{int i,j;
token *tp1, *tp2;
tokmode = 1;
j = i = twp - ct; /* number of valid tokens in buf */
if (i>0)
{tp1 = tokbuf-1;
tp2 = ct-1;
while (i--)
{(++tp1)->type = (++tp2)->type;
tp1->index = tp2->index;
tp1->line = tp2->line;
}
}
ct = tokbuf;
twp = ct + j;
}
tklem()
{tokmode = 0;}
/**********************************************************************
RTOKEN - PARSER READ TOKEN ROUTINE
**********************************************************************/
rtoken(p) token *p;
{
gettok();
p->type = lextype;
p->index = lexindex;
p->line = lexline;
}
/**********************************************************************
PARSER ERROR MESSAGE ROUTINES
synerr - announce syntax error
delmsg - print "DELETED:" message
skpmsg - print "SKIPPED:" message
qprint - print symbol corresponding to parser state
tprint - print token
pcursor - print cursor symbol
*** fatal errors ***
giveup - announce failure of recovery attempt
stkovf - parser stack overflow
*** internal fatal errors ***
stkunf - parser stack underflow
tkbovf - token buffer overflow
badtwp - inconsistent token pointers
badtok - bad token reference
*****
The routines are contained in the file YERROR.C so that
one may easily substitute other routines for them.
*/