BSD 4_3_Reno release
[unix-history] / usr / src / pgrm / pascal / pdx / command / token.l
CommitLineData
6858bd7a 1%{
f6f0d0bf
KM
2/*
3 * Copyright (c) 1982 Regents of the University of California.
4 * All rights reserved. The Berkeley software License Agreement
5 * specifies the terms and conditions for redistribution.
6 */
6858bd7a 7
f6f0d0bf 8#ifndef lint
1c15e888 9static char sccsid[] = "@(#)token.l 5.3 (Berkeley) 6/29/90";
f6f0d0bf 10#endif not lint
6858bd7a
ML
11
12/*
13 * Token definitions for pdx scanner.
14 */
15
16#include "defs.h"
17#include "command.h"
18#include "y.tab.h"
23cc830f 19#include "main.h"
6858bd7a
ML
20#include "symtab.h"
21#include "sym.h"
22#include "process.h"
23#include "process/pxinfo.h"
24
25char *initfile = ".pdxinit";
26
b852fd9f
KB
27/* override Lex default input macro. */
28LOCAL int pdxinput();
29
30#undef YY_INPUT
31#define YY_INPUT(buf,result,max_size) \
32 { \
33 int c = pdxinput(); \
34 if ( c == EOF ) \
35 result = YY_NULL; \
36 else \
37 { \
38 buf[0] = c; \
39 result = 1; \
40 } \
41 }
6858bd7a
ML
42
43%}
44
45blank [ \t]
46white {blank}+
47alpha [a-zA-Z]
48digit [0-9]
49n {digit}+
50h [0-9a-fA-F]+
51e (("e"|"E")("+"|"-")?{n})
52alphanum [a-zA-Z0-9]
53ident {alpha}{alphanum}*
54filenm [^ \t\n"<>!*"]+
6858bd7a
ML
55string '[^']+'('[^']*')*
56newline "\n"
57char .
58
b852fd9f 59%Start File sh
6858bd7a
ML
60
61%%
62
63{white} ;
64^sh{white}.*$ { BEGIN 0; yylval.y_string = &yytext[3]; return(SH); }
65^sh { BEGIN 0; yylval.y_string = NIL; return(SH); }
66^{ident} { return(findcmd(yytext)); }
b852fd9f
KB
67<File>{filenm} { yylval.y_string = strdup(yytext); return(FILENAME); }
68{filenm}/":" { yylval.y_string = strdup(yytext); return(FILENAME); }
6858bd7a
ML
69{n}?\.{n}{e}? { yylval.y_real = atof(yytext); return(REAL); }
700{n} { yylval.y_long = octal(yytext); return(INT); }
710x{h} { yylval.y_long = hex(yytext); return(INT); }
72{n} { yylval.y_long = atol(yytext); return(INT); }
6858bd7a
ML
73at { return(AT); }
74{ident} { return(ident(yytext)); }
75{string} { yylval.y_string = yytext; return(STRING); }
76"%dp" { yylval.y_long = (long) DP; return(INT); }
77{newline} { BEGIN 0; nlflag = TRUE; return('\n'); }
78{char} { return(yylval.y_int = yytext[0]); }
79
80%%
81
82LOCAL SYMTAB *dbtab, *specialtab;
83
84/*
85 * Look for the given string in the debugger keyword table.
86 * If it's there, return the associated token, otherwise report an error.
87 */
88
89LOCAL int findcmd(s)
90char *s;
91{
92 register SYM *p;
93
94 if ((p = st_lookup(dbtab, s)) == NIL) {
95 error("\"%s\" is not a command", s);
96 }
97 yylval.y_int = tokval(p);
98 switch (toknum(p)) {
99 case ALIAS:
100 case DUMP:
101 case EDIT:
102 case CHFILE:
103 case RUN:
104 case SOURCE:
105 case STATUS:
b852fd9f 106 BEGIN File;
6858bd7a
ML
107 break;
108
109 default:
110 /* do nothing */;
111 }
112 return(toknum(p));
113}
114
115/*
116 * Look for a symbol, first in the special table (if, in, etc.)
117 * then in the symbol table. If it's there, return the SYM pointer,
118 * otherwise it's an error.
119 */
120
121LOCAL int ident(s)
122char *s;
123{
124 register SYM *p;
125
126 if ((p = st_lookup(specialtab, s)) != NIL) {
127 yylval.y_sym = p;
128 return(toknum(p));
129 }
130 p = st_lookup(symtab, s);
131 if (p == NIL) {
132 if (strcmp(s, "nil") == 0) {
133 yylval.y_long = 0L;
134 return(INT);
135 } else {
136 error("\"%s\" is not defined", s);
137 }
138 }
139 yylval.y_sym = p;
140 return(NAME);
141}
142
143/*
144 * Convert a string to octal. No check that digits are less than 8.
145 */
146
147LOCAL int octal(s)
148char *s;
149{
150 register char *p;
151 register int n;
152
153 n = 0;
154 for (p = s; *p != '\0'; p++) {
155 n = 8*n + (*p - '0');
156 }
157 return(n);
158}
159
160/*
161 * Convert a string to hex.
162 */
163
164LOCAL int hex(s)
165char *s;
166{
167 register char *p;
168 register int n;
169
170 n = 0;
171 for (p = s+2; *p != '\0'; p++) {
172 n *= 16;
173 if (*p >= 'a' && *p <= 'f') {
174 n += (*p - 'a' + 10);
175 } else if (*p >= 'A' && *p <= 'F') {
176 n += (*p - 'A' + 10);
177 } else {
178 n += (*p - '0');
179 }
180 }
181 return(n);
182}
183
184/*
185 * Initialize the debugger keyword table (dbtab) and special symbol
186 * table (specialtab).
187 */
188
189#define db_keyword(nm, n) make_keyword(dbtab, nm, n)
190#define sp_keyword(nm, n) make_keyword(specialtab, nm, n)
191
192lexinit()
193{
194 dbtab = st_creat(150);
195 db_keyword("alias", ALIAS);
196 db_keyword("assign", ASSIGN);
197 db_keyword("call", CALL);
198 db_keyword("cont", CONT);
199 db_keyword("delete", DELETE);
200 db_keyword("dump", DUMP);
201 db_keyword("edit", EDIT);
202 db_keyword("file", CHFILE);
203 db_keyword("gripe", GRIPE);
204 db_keyword("help", HELP);
205 db_keyword("list", LIST);
206 db_keyword("next", NEXT);
207 db_keyword("pi", REMAKE);
208 db_keyword("print", PRINT);
209 db_keyword("quit", QUIT);
210 db_keyword("run", RUN);
211 db_keyword("sh", SH);
212 db_keyword("source", SOURCE);
213 db_keyword("status", STATUS);
214 db_keyword("step", STEP);
215 db_keyword("stop", STOP);
216 db_keyword("stopi", STOPI);
217 db_keyword("trace", TRACE);
218 db_keyword("tracei", TRACEI);
219 db_keyword("whatis", WHATIS);
220 db_keyword("where", WHERE);
221 db_keyword("which", WHICH);
222 db_keyword("xd", XD);
223 db_keyword("xi", XI);
224
225 specialtab = st_creat(10);
226 sp_keyword("div", DIV);
227 sp_keyword("mod", MOD);
228 sp_keyword("in", IN);
229 sp_keyword("if", IF);
230 sp_keyword("and", AND);
231 sp_keyword("or", OR);
232}
233
234/*
235 * Send an alias directive over to the symbol table manager.
236 */
237
238alias(new, old)
239char *new, *old;
240{
241 if (old == NIL) {
242 print_alias(dbtab, new);
243 } else {
244 enter_alias(dbtab, new, old);
245 }
246}
247
248/*
249 * Input file management routines, "yyin" is Lex's idea of
250 * where the input comes from.
251 */
252
253#define MAXINPUT 10
254
255LOCAL FILE *infp[MAXINPUT];
256LOCAL FILE **curfp = &infp[0];
257
258LOCAL BOOLEAN isnewfile;
23cc830f 259LOCAL BOOLEAN firsttime;
6858bd7a
ML
260
261/*
262 * Initially, we set the input to the initfile if it exists.
263 * If it does exist, we play a game or two to avoid generating
264 * multiple prompts.
265 */
266
267initinput()
268{
269 FILE *fp;
270
23cc830f 271 firsttime = FALSE;
6858bd7a
ML
272 fp = fopen(initfile, "r");
273 if (fp != NIL) {
274 fclose(fp);
275 setinput(initfile);
23cc830f
ML
276 if (!option('r')) {
277 firsttime = TRUE;
278 }
6858bd7a
ML
279 }
280 nlflag = TRUE;
281}
282
283/*
284 * Set the input to the named file. It is expected that the file exists
285 * and is readable.
286 */
287
288setinput(filename)
289char *filename;
290{
291 register FILE *fp;
292
293 if ((fp = fopen(filename, "r")) == NIL) {
294 error("can't open %s", filename);
295 }
296 if (curfp >= &infp[MAXINPUT]) {
297 error("unreasonable input nesting on %s", filename);
298 }
299 *curfp++ = yyin;
300 yyin = fp;
301 isnewfile = TRUE;
302}
303
304BOOLEAN isstdin()
305{
306 return((BOOLEAN) (yyin == stdin));
307}
308
b852fd9f 309LOCAL int pdxinput()
6858bd7a
ML
310{
311 register int c;
312
313 if (isnewfile) {
314 isnewfile = FALSE;
315 return('\n');
316 }
317 while ((c = getc(yyin)) == EOF) {
318 if (curfp == &infp[0]) {
319 return(0);
320 } else {
321 fclose(yyin);
322 yyin = *--curfp;
323 if (yyin == stdin) {
23cc830f
ML
324 if (firsttime) {
325 firsttime = FALSE;
326 } else {
327 prompt();
328 }
6858bd7a
ML
329 }
330 }
331 }
332 return(c);
333}
334
6858bd7a
ML
335/*
336 * prompt for a command
337 */
338
339prompt()
340{
341 nlflag = FALSE;
342 if (yyin == stdin) {
343 printf("> ");
344 fflush(stdout);
345 }
346}