xref: /386bsd/usr/src/kernel/ddb/db_lex.c (revision a2142627)
1*a2142627SBen Jolitz /*
2*a2142627SBen Jolitz  * Mach Operating System
3*a2142627SBen Jolitz  * Copyright (c) 1991,1990 Carnegie Mellon University
4*a2142627SBen Jolitz  * All Rights Reserved.
5*a2142627SBen Jolitz  *
6*a2142627SBen Jolitz  * Permission to use, copy, modify and distribute this software and its
7*a2142627SBen Jolitz  * documentation is hereby granted, provided that both the copyright
8*a2142627SBen Jolitz  * notice and this permission notice appear in all copies of the
9*a2142627SBen Jolitz  * software, derivative works or modified versions, and any portions
10*a2142627SBen Jolitz  * thereof, and that both notices appear in supporting documentation.
11*a2142627SBen Jolitz  *
12*a2142627SBen Jolitz  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS
13*a2142627SBen Jolitz  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14*a2142627SBen Jolitz  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15*a2142627SBen Jolitz  *
16*a2142627SBen Jolitz  * Carnegie Mellon requests users of this software to return to
17*a2142627SBen Jolitz  *
18*a2142627SBen Jolitz  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
19*a2142627SBen Jolitz  *  School of Computer Science
20*a2142627SBen Jolitz  *  Carnegie Mellon University
21*a2142627SBen Jolitz  *  Pittsburgh PA 15213-3890
22*a2142627SBen Jolitz  *
23*a2142627SBen Jolitz  * any improvements or extensions that they make and grant Carnegie the
24*a2142627SBen Jolitz  * rights to redistribute these changes.
25*a2142627SBen Jolitz  */
26*a2142627SBen Jolitz /*
27*a2142627SBen Jolitz  * HISTORY
28*a2142627SBen Jolitz  * $Log: db_lex.c,v $
29*a2142627SBen Jolitz  * Revision 1.1  1992/03/25  21:45:13  pace
30*a2142627SBen Jolitz  * Initial revision
31*a2142627SBen Jolitz  *
32*a2142627SBen Jolitz  * Revision 2.3  91/02/05  17:06:36  mrt
33*a2142627SBen Jolitz  * 	Changed to new Mach copyright
34*a2142627SBen Jolitz  * 	[91/01/31  16:18:20  mrt]
35*a2142627SBen Jolitz  *
36*a2142627SBen Jolitz  * Revision 2.2  90/08/27  21:51:10  dbg
37*a2142627SBen Jolitz  * 	Add 'dotdot' token.
38*a2142627SBen Jolitz  * 	[90/08/22            dbg]
39*a2142627SBen Jolitz  *
40*a2142627SBen Jolitz  * 	Allow backslash to quote any character into an identifier.
41*a2142627SBen Jolitz  * 	Allow colon in identifier for symbol table qualification.
42*a2142627SBen Jolitz  * 	[90/08/16            dbg]
43*a2142627SBen Jolitz  * 	Reduce lint.
44*a2142627SBen Jolitz  * 	[90/08/07            dbg]
45*a2142627SBen Jolitz  * 	Created.
46*a2142627SBen Jolitz  * 	[90/07/25            dbg]
47*a2142627SBen Jolitz  *
48*a2142627SBen Jolitz  */
49*a2142627SBen Jolitz /*
50*a2142627SBen Jolitz  *	Author: David B. Golub, Carnegie Mellon University
51*a2142627SBen Jolitz  *	Date:	7/90
52*a2142627SBen Jolitz  */
53*a2142627SBen Jolitz /*
54*a2142627SBen Jolitz  * Lexical analyzer.
55*a2142627SBen Jolitz  */
56*a2142627SBen Jolitz #include "db_lex.h"
57*a2142627SBen Jolitz 
58*a2142627SBen Jolitz char	db_line[120];
59*a2142627SBen Jolitz char *	db_lp, *db_endlp;
60*a2142627SBen Jolitz 
61*a2142627SBen Jolitz int
db_read_line()62*a2142627SBen Jolitz db_read_line()
63*a2142627SBen Jolitz {
64*a2142627SBen Jolitz 	int	i;
65*a2142627SBen Jolitz 
66*a2142627SBen Jolitz 	i = db_readline(db_line, sizeof(db_line));
67*a2142627SBen Jolitz 	if (i == 0)
68*a2142627SBen Jolitz 	    return (0);	/* EOI */
69*a2142627SBen Jolitz 	db_lp = db_line;
70*a2142627SBen Jolitz 	db_endlp = db_lp + i;
71*a2142627SBen Jolitz 	return (i);
72*a2142627SBen Jolitz }
73*a2142627SBen Jolitz 
74*a2142627SBen Jolitz void
db_flush_line()75*a2142627SBen Jolitz db_flush_line()
76*a2142627SBen Jolitz {
77*a2142627SBen Jolitz 	db_lp = db_line;
78*a2142627SBen Jolitz 	db_endlp = db_line;
79*a2142627SBen Jolitz }
80*a2142627SBen Jolitz 
81*a2142627SBen Jolitz int	db_look_char = 0;
82*a2142627SBen Jolitz 
83*a2142627SBen Jolitz int
db_read_char()84*a2142627SBen Jolitz db_read_char()
85*a2142627SBen Jolitz {
86*a2142627SBen Jolitz 	int	c;
87*a2142627SBen Jolitz 
88*a2142627SBen Jolitz 	if (db_look_char != 0) {
89*a2142627SBen Jolitz 	    c = db_look_char;
90*a2142627SBen Jolitz 	    db_look_char = 0;
91*a2142627SBen Jolitz 	}
92*a2142627SBen Jolitz 	else if (db_lp >= db_endlp)
93*a2142627SBen Jolitz 	    c = -1;
94*a2142627SBen Jolitz 	else
95*a2142627SBen Jolitz 	    c = *db_lp++;
96*a2142627SBen Jolitz 	return (c);
97*a2142627SBen Jolitz }
98*a2142627SBen Jolitz 
99*a2142627SBen Jolitz void
db_unread_char(c)100*a2142627SBen Jolitz db_unread_char(c)
101*a2142627SBen Jolitz {
102*a2142627SBen Jolitz 	db_look_char = c;
103*a2142627SBen Jolitz }
104*a2142627SBen Jolitz 
105*a2142627SBen Jolitz int	db_look_token = 0;
106*a2142627SBen Jolitz 
107*a2142627SBen Jolitz void
db_unread_token(t)108*a2142627SBen Jolitz db_unread_token(t)
109*a2142627SBen Jolitz 	int	t;
110*a2142627SBen Jolitz {
111*a2142627SBen Jolitz 	db_look_token = t;
112*a2142627SBen Jolitz }
113*a2142627SBen Jolitz 
114*a2142627SBen Jolitz int
db_read_token()115*a2142627SBen Jolitz db_read_token()
116*a2142627SBen Jolitz {
117*a2142627SBen Jolitz 	int	t;
118*a2142627SBen Jolitz 
119*a2142627SBen Jolitz 	if (db_look_token) {
120*a2142627SBen Jolitz 	    t = db_look_token;
121*a2142627SBen Jolitz 	    db_look_token = 0;
122*a2142627SBen Jolitz 	}
123*a2142627SBen Jolitz 	else
124*a2142627SBen Jolitz 	    t = db_lex();
125*a2142627SBen Jolitz 	return (t);
126*a2142627SBen Jolitz }
127*a2142627SBen Jolitz 
128*a2142627SBen Jolitz int	db_tok_number;
129*a2142627SBen Jolitz char	db_tok_string[TOK_STRING_SIZE];
130*a2142627SBen Jolitz 
131*a2142627SBen Jolitz int	db_radix = 16;
132*a2142627SBen Jolitz 
133*a2142627SBen Jolitz void
db_flush_lex()134*a2142627SBen Jolitz db_flush_lex()
135*a2142627SBen Jolitz {
136*a2142627SBen Jolitz 	db_flush_line();
137*a2142627SBen Jolitz 	db_look_char = 0;
138*a2142627SBen Jolitz 	db_look_token = 0;
139*a2142627SBen Jolitz }
140*a2142627SBen Jolitz 
141*a2142627SBen Jolitz int
db_lex()142*a2142627SBen Jolitz db_lex()
143*a2142627SBen Jolitz {
144*a2142627SBen Jolitz 	int	c;
145*a2142627SBen Jolitz 
146*a2142627SBen Jolitz 	c = db_read_char();
147*a2142627SBen Jolitz 	while (c <= ' ' || c > '~') {
148*a2142627SBen Jolitz 	    if (c == '\n' || c == -1)
149*a2142627SBen Jolitz 		return (tEOL);
150*a2142627SBen Jolitz 	    c = db_read_char();
151*a2142627SBen Jolitz 	}
152*a2142627SBen Jolitz 
153*a2142627SBen Jolitz 	if (c >= '0' && c <= '9') {
154*a2142627SBen Jolitz 	    /* number */
155*a2142627SBen Jolitz 	    int	r, digit;
156*a2142627SBen Jolitz 
157*a2142627SBen Jolitz 	    if (c > '0')
158*a2142627SBen Jolitz 		r = db_radix;
159*a2142627SBen Jolitz 	    else {
160*a2142627SBen Jolitz 		c = db_read_char();
161*a2142627SBen Jolitz 		if (c == 'O' || c == 'o')
162*a2142627SBen Jolitz 		    r = 8;
163*a2142627SBen Jolitz 		else if (c == 'T' || c == 't')
164*a2142627SBen Jolitz 		    r = 10;
165*a2142627SBen Jolitz 		else if (c == 'X' || c == 'x')
166*a2142627SBen Jolitz 		    r = 16;
167*a2142627SBen Jolitz 		else {
168*a2142627SBen Jolitz 		    r = db_radix;
169*a2142627SBen Jolitz 		    db_unread_char(c);
170*a2142627SBen Jolitz 		}
171*a2142627SBen Jolitz 		c = db_read_char();
172*a2142627SBen Jolitz 	    }
173*a2142627SBen Jolitz 	    db_tok_number = 0;
174*a2142627SBen Jolitz 	    for (;;) {
175*a2142627SBen Jolitz 		if (c >= '0' && c <= ((r == 8) ? '7' : '9'))
176*a2142627SBen Jolitz 		    digit = c - '0';
177*a2142627SBen Jolitz 		else if (r == 16 && ((c >= 'A' && c <= 'F') ||
178*a2142627SBen Jolitz 				     (c >= 'a' && c <= 'f'))) {
179*a2142627SBen Jolitz 		    if (c >= 'a')
180*a2142627SBen Jolitz 			digit = c - 'a' + 10;
181*a2142627SBen Jolitz 		    else if (c >= 'A')
182*a2142627SBen Jolitz 			digit = c - 'A' + 10;
183*a2142627SBen Jolitz 		}
184*a2142627SBen Jolitz 		else
185*a2142627SBen Jolitz 		    break;
186*a2142627SBen Jolitz 		db_tok_number = db_tok_number * r + digit;
187*a2142627SBen Jolitz 		c = db_read_char();
188*a2142627SBen Jolitz 	    }
189*a2142627SBen Jolitz 	    if ((c >= '0' && c <= '9') ||
190*a2142627SBen Jolitz 		(c >= 'A' && c <= 'Z') ||
191*a2142627SBen Jolitz 		(c >= 'a' && c <= 'z') ||
192*a2142627SBen Jolitz 		(c == '_'))
193*a2142627SBen Jolitz 	    {
194*a2142627SBen Jolitz 		db_error("Bad character in number\n");
195*a2142627SBen Jolitz 		db_flush_lex();
196*a2142627SBen Jolitz 		return (tEOF);
197*a2142627SBen Jolitz 	    }
198*a2142627SBen Jolitz 	    db_unread_char(c);
199*a2142627SBen Jolitz 	    return (tNUMBER);
200*a2142627SBen Jolitz 	}
201*a2142627SBen Jolitz 	if ((c >= 'A' && c <= 'Z') ||
202*a2142627SBen Jolitz 	    (c >= 'a' && c <= 'z') ||
203*a2142627SBen Jolitz 	    c == '_' || c == '\\')
204*a2142627SBen Jolitz 	{
205*a2142627SBen Jolitz 	    /* string */
206*a2142627SBen Jolitz 	    char *cp;
207*a2142627SBen Jolitz 
208*a2142627SBen Jolitz 	    cp = db_tok_string;
209*a2142627SBen Jolitz 	    if (c == '\\') {
210*a2142627SBen Jolitz 		c = db_read_char();
211*a2142627SBen Jolitz 		if (c == '\n' || c == -1)
212*a2142627SBen Jolitz 		    db_error("Bad escape\n");
213*a2142627SBen Jolitz 	    }
214*a2142627SBen Jolitz 	    *cp++ = c;
215*a2142627SBen Jolitz 	    while (1) {
216*a2142627SBen Jolitz 		c = db_read_char();
217*a2142627SBen Jolitz 		if ((c >= 'A' && c <= 'Z') ||
218*a2142627SBen Jolitz 		    (c >= 'a' && c <= 'z') ||
219*a2142627SBen Jolitz 		    (c >= '0' && c <= '9') ||
220*a2142627SBen Jolitz 		    c == '_' || c == '\\' || c == ':')
221*a2142627SBen Jolitz 		{
222*a2142627SBen Jolitz 		    if (c == '\\') {
223*a2142627SBen Jolitz 			c = db_read_char();
224*a2142627SBen Jolitz 			if (c == '\n' || c == -1)
225*a2142627SBen Jolitz 			    db_error("Bad escape\n");
226*a2142627SBen Jolitz 		    }
227*a2142627SBen Jolitz 		    *cp++ = c;
228*a2142627SBen Jolitz 		    if (cp == db_tok_string+sizeof(db_tok_string)) {
229*a2142627SBen Jolitz 			db_error("String too long\n");
230*a2142627SBen Jolitz 			db_flush_lex();
231*a2142627SBen Jolitz 			return (tEOF);
232*a2142627SBen Jolitz 		    }
233*a2142627SBen Jolitz 		    continue;
234*a2142627SBen Jolitz 		}
235*a2142627SBen Jolitz 		else {
236*a2142627SBen Jolitz 		    *cp = '\0';
237*a2142627SBen Jolitz 		    break;
238*a2142627SBen Jolitz 		}
239*a2142627SBen Jolitz 	    }
240*a2142627SBen Jolitz 	    db_unread_char(c);
241*a2142627SBen Jolitz 	    return (tIDENT);
242*a2142627SBen Jolitz 	}
243*a2142627SBen Jolitz 
244*a2142627SBen Jolitz 	switch (c) {
245*a2142627SBen Jolitz 	    case '+':
246*a2142627SBen Jolitz 		return (tPLUS);
247*a2142627SBen Jolitz 	    case '-':
248*a2142627SBen Jolitz 		return (tMINUS);
249*a2142627SBen Jolitz 	    case '.':
250*a2142627SBen Jolitz 		c = db_read_char();
251*a2142627SBen Jolitz 		if (c == '.')
252*a2142627SBen Jolitz 		    return (tDOTDOT);
253*a2142627SBen Jolitz 		db_unread_char(c);
254*a2142627SBen Jolitz 		return (tDOT);
255*a2142627SBen Jolitz 	    case '*':
256*a2142627SBen Jolitz 		return (tSTAR);
257*a2142627SBen Jolitz 	    case '/':
258*a2142627SBen Jolitz 		return (tSLASH);
259*a2142627SBen Jolitz 	    case '=':
260*a2142627SBen Jolitz 		return (tEQ);
261*a2142627SBen Jolitz 	    case '%':
262*a2142627SBen Jolitz 		return (tPCT);
263*a2142627SBen Jolitz 	    case '#':
264*a2142627SBen Jolitz 		return (tHASH);
265*a2142627SBen Jolitz 	    case '(':
266*a2142627SBen Jolitz 		return (tLPAREN);
267*a2142627SBen Jolitz 	    case ')':
268*a2142627SBen Jolitz 		return (tRPAREN);
269*a2142627SBen Jolitz 	    case ',':
270*a2142627SBen Jolitz 		return (tCOMMA);
271*a2142627SBen Jolitz 	    case '"':
272*a2142627SBen Jolitz 		return (tDITTO);
273*a2142627SBen Jolitz 	    case '$':
274*a2142627SBen Jolitz 		return (tDOLLAR);
275*a2142627SBen Jolitz 	    case '!':
276*a2142627SBen Jolitz 		return (tEXCL);
277*a2142627SBen Jolitz 	    case '<':
278*a2142627SBen Jolitz 		c = db_read_char();
279*a2142627SBen Jolitz 		if (c == '<')
280*a2142627SBen Jolitz 		    return (tSHIFT_L);
281*a2142627SBen Jolitz 		db_unread_char(c);
282*a2142627SBen Jolitz 		break;
283*a2142627SBen Jolitz 	    case '>':
284*a2142627SBen Jolitz 		c = db_read_char();
285*a2142627SBen Jolitz 		if (c == '>')
286*a2142627SBen Jolitz 		    return (tSHIFT_R);
287*a2142627SBen Jolitz 		db_unread_char(c);
288*a2142627SBen Jolitz 		break;
289*a2142627SBen Jolitz 	    case -1:
290*a2142627SBen Jolitz 		return (tEOF);
291*a2142627SBen Jolitz 	}
292*a2142627SBen Jolitz 	db_printf("Bad character\n");
293*a2142627SBen Jolitz 	db_flush_lex();
294*a2142627SBen Jolitz 	return (tEOF);
295*a2142627SBen Jolitz }
296