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