|
|
1.1 root 1: # include <ingres.h>
2: # include "scanner.h"
3: # include <sccs.h>
4:
5: SCCSID(@(#)s_yylex.c 7.2 5/4/83)
6:
7: struct special Tokens; /* special tokens table */
8: struct optab Optab[]; /* operator table */
9: struct optab Keyword[]; /* keyword table */
10: struct lastok Lastok;
11: int Opcode; /* opcode for current token */
12: int Lcase; /* UPPER->lower conversion flag */
13: int Pars; /* flag for call to getcvar or not */
14: int Newline; /* set if last char read was a newline */
15: int Cflag; /* set if line of C-code recognized */
16: int Keyent; /* number of entries in the Keyword table */
17:
18: char Sbuf[SBUFSIZ]; /* symbol table buffer */
19:
20: /*
21: ** YYLEX
22: ** This is the control program for the scanner (lexical analyzer).
23: ** Each call to yylex() returns a token for the next syntactic unit.
24: ** If the object is of type I2CONST, I4CONST, F8CONST, SCONST or NAME, that
25: ** object will also be entered in the symbol table, indexed by 'yylval'.
26: ** If the object is not one of these types, yylval is the opcode field of
27: ** the operator or keyword tables.
28: ** The end-of-file token is zero.
29: */
30: yylex()
31: {
32: register char chr;
33: register int rtval;
34: extern char Cmap[];
35:
36: rtval = -1;
37: Lastok.tokop = 0;
38: /* GET NEXT TOKEN */
39: do
40: {
41: if((chr = get_scan(NORMAL)) <= 0)
42: {
43: # ifdef xSTR2
44: tTfp(72, 8, "end-of-file\n");
45: # endif
46: rtval = 0;
47: break;
48: }
49: switch(Cmap[chr])
50: {
51: case ALPHA:
52: rtval = name(chr);
53: break;
54:
55: case NUMBR:
56: rtval = number(chr);
57: break;
58:
59: case OPATR:
60: if ((rtval = operator(chr)) == 0)
61: rtval = -1;
62: break;
63:
64: case PUNCT:
65: continue;
66:
67: case CNTRL:
68: /* already converted number ? */
69: if (Pars)
70: switch (chr)
71: {
72: case CVAR_I2:
73: rtval = getcvar(Tokens.i2const, 2);
74: break;
75:
76: case CVAR_I4:
77: rtval = getcvar(Tokens.i4const, 4);
78: break;
79:
80: case CVAR_F8:
81: rtval = getcvar(Tokens.f8const, 8);
82: break;
83:
84: case CVAR_S:
85: rtval = getcvar(Tokens.sconst, 0);
86: break;
87:
88: default:
89: printf("funny character 0%o ingnored\n", chr);
90: continue;
91: }
92: break;
93: default:
94: syserr("invalid type in yylex()");
95: }
96: } while (rtval == -1);
97: if (rtval == 0)
98: {
99: Lastok.tokop = GOVAL;
100: Lastok.tok = 0;
101: Lastok.toktyp = 0;
102: }
103: return (rtval);
104: }
105:
106:
107: getcvar(type, len)
108: int type;
109: int len;
110: {
111: extern char *yylval;
112: extern char Cmap[];
113: extern char *syment();
114: register int save;
115: char buf[MAXSTRING + 1];
116:
117: save = Lcase;
118: Lcase = 0;
119: yylval = buf;
120: if (len)
121: while ((yylval - buf) < len)
122: *yylval++ = get_scan(NORMAL);
123: else
124: {
125: do
126: {
127: *yylval = get_scan(NORMAL);
128: if ((yylval - buf) > MAXSTRING)
129: {
130: Lcase = save;
131: par_error(STRLONG, WARN, 0);
132: }
133: if (Cmap[*yylval] == CNTRL && *yylval != '\0')
134: {
135: Lcase = save;
136: /* control char in string from equel */
137: par_error(CNTRLCHR, WARN, 0);
138: }
139: } while (*yylval++);
140: len = yylval - buf;
141: }
142: Lcase = save;
143: yylval = syment(buf, len);
144: Lastok.tok = yylval;
145: Lastok.toktyp = type;
146: return (type);
147: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.