|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)rlex.c 1.2 (Berkeley) 8/11/83";
3: #endif
4:
5: # include "r.h"
6:
7: char *keyword [] = {
8: "do",
9: "if",
10: "else",
11: "for",
12: "repeat",
13: "until",
14: "while",
15: "break",
16: "next",
17: "define",
18: "include",
19: "return",
20: "switch",
21: "case",
22: "default",
23: 0};
24:
25: int keytran[] = {
26: DO,
27: IF,
28: ELSE,
29: FOR,
30: REPEAT,
31: UNTIL,
32: WHILE,
33: BREAK,
34: NEXT,
35: DEFINE,
36: INCLUDE,
37: RETURN,
38: SWITCH,
39: CASE,
40: DEFAULT,
41: 0};
42:
43: char *fcnloc; /* spot for "function" */
44:
45: int svargc;
46: char **svargv;
47: char *curfile[10] = { "" };
48: int infptr = 0;
49: FILE *outfil = { stdout };
50: FILE *infile[10] = { stdin };
51: int linect[10];
52:
53: int contfld = CONTFLD; /* place to put continuation char */
54: int printcom = 0; /* print comments if on */
55: int hollerith = 0; /* convert "..." to 27H... if on */
56:
57: #ifdef gcos
58: char *ratfor "tssrat";
59: int bcdrat[2];
60: char *bwkmeter ". bwkmeter ";
61: int bcdbwk[5];
62: #endif
63:
64: main(argc,argv) int argc; char **argv; {
65: int i;
66: while(argc>1 && argv[1][0]=='-') {
67: if(argv[1][1]=='6') {
68: contfld=6;
69: if (argv[1][2]!='\0')
70: contchar = argv[1][2];
71: } else if (argv[1][1] == 'C')
72: printcom++;
73: else if (argv[1][1] == 'h')
74: hollerith++;
75: argc--;
76: argv++;
77: }
78:
79: #ifdef gcos
80: if (!intss()) {
81: _fixup();
82: ratfor = "batrat";
83: }
84: ascbcd(ratfor,bcdrat,6);
85: ascbcd(bwkmeter,bcdbwk,24);
86: acdata(bcdrat[0],1);
87: acupdt(bcdbwk[0]);
88: if (!intss()) {
89: if ((infile[infptr]=fopen("s*", "r")) == NULL)
90: cant("s*");
91: if ((outfil=fopen("*s", "w")) == NULL)
92: cant("*s");
93: }
94: #endif
95:
96: svargc = argc;
97: svargv = argv;
98: if (svargc > 1)
99: putbak('\0');
100: for (i=0; keyword[i]; i++)
101: install(keyword[i], "", keytran[i]);
102: fcnloc = install("function", "", 0);
103: yyparse();
104: #ifdef gcos
105: if (!intss())
106: bexit(errorflag);
107: #endif
108: exit(errorflag);
109: }
110:
111: #ifdef gcos
112: bexit(status) {
113: /* this is the batch version of exit for gcos tss */
114: FILE *inf, *outf;
115: char c;
116:
117: fclose(stderr); /* make sure diagnostics get flushed */
118: if (status) /* abort */
119: _nogud();
120:
121: /* good: copy output back to s*, call forty */
122:
123: fclose(outfil,"r");
124: fclose(infile[0],"r");
125: inf = fopen("*s", "r");
126: outf = fopen("s*", "w");
127: while ((c=getc(inf)) != EOF)
128: putc(c, outf);
129: fclose(inf,"r");
130: fclose(outf,"r");
131: __imok();
132: }
133: #endif
134:
135: cant(s) char *s; {
136: linect[infptr] = 0;
137: curfile[infptr] = s;
138: error("can't open");
139: exit(1);
140: }
141:
142: inclstat() {
143: int c;
144: char *ps;
145: char fname[100];
146: while ((c = getchr()) == ' ' || c == '\t');
147: if (c == '(') {
148: for (ps=fname; (*ps=getchr()) != ')'; ps++);
149: *ps = '\0';
150: } else if (c == '"' || c == '\'') {
151: for (ps=fname; (*ps=getchr()) != c; ps++);
152: *ps = '\0';
153: } else {
154: putbak(c);
155: for (ps=fname; (*ps=getchr()) != ' ' &&*ps!='\t' && *ps!='\n' && *ps!=';'; ps++);
156: *ps = '\0';
157: }
158: if ((infile[++infptr] = fopen(fname,"r")) == NULL) {
159: cant(fname);
160: exit(1);
161: }
162: linect[infptr] = 0;
163: curfile[infptr] = fname;
164: }
165:
166: char str[500];
167: int nstr;
168:
169: yylex() {
170: int c, t;
171: for (;;) {
172: while ((c=gtok(str))==' ' || c=='\n' || c=='\t')
173: ;
174: yylval = c;
175: if (c==';' || c=='{' || c=='}')
176: return(c);
177: if (c==EOF)
178: return(0);
179: yylval = (int) str;
180: if (c == DIG)
181: return(DIGITS);
182: t = lookup(str)->ydef;
183: if (t==DEFINE)
184: defstat();
185: else if (t==INCLUDE)
186: inclstat();
187: else if (t > 0)
188: return(t);
189: else
190: return(GOK);
191: }
192: }
193:
194: int dbg = 0;
195:
196: yyerror(p) char *p; {;}
197:
198:
199: defstat() {
200: int c,i,val,t,nlp;
201: extern int nstr;
202: extern char str[];
203: while ((c=getchr())==' ' || c=='\t');
204: if (c == '(') {
205: t = '(';
206: while ((c=getchr())==' ' || c=='\t');
207: putbak(c);
208: }
209: else {
210: t = ' ';
211: putbak(c);
212: }
213: for (nstr=0; c=getchr(); nstr++) {
214: if (type[c] != LET && type[c] != DIG)
215: break;
216: str[nstr] = c;
217: }
218: putbak(c);
219: str[nstr] = '\0';
220: if (c != ' ' && c != '\t' && c != '\n' && c != ',') {
221: error("illegal define statement");
222: return;
223: }
224: val = nstr+1;
225: if (t == ' ') {
226: while ((c=getchr())==' ' || c=='\t');
227: putbak(c);
228: for (i=val; (c=getchr())!='\n' && c!='#' && c!='\0'; i++)
229: str[i] = c;
230: putbak(c);
231: } else {
232: while ((c=getchr())==' ' || c=='\t' || c==',' || c=='\n');
233: putbak(c);
234: nlp = 0;
235: for (i=val; nlp>=0 && (c=str[i]=getchr()); i++)
236: if (c == '(')
237: nlp++;
238: else if (c == ')')
239: nlp--;
240: i--;
241: }
242: for ( ; i>0; i--)
243: if (str[i-1] != ' ' && str[i-1] != '\t')
244: break;
245: str[i] = '\0';
246: install(str, &str[val], 0);
247: }
248:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.