1: # include <stdio.h>
2: # include "constants.h"
3: # include "globals.h"
4: # include "y.tab.h"
5: # include <sccs.h>
6:
7: SCCSID(@(#)yylex.c 8.1 12/31/84)
8:
9:
10: /*
11: ** YYLEX -- Lexical analyzer
12: ** Yylex controls the return to the parser of lexemes,
13: ** and the copying out of C_CODE on the all to yylex
14: ** after yylex() returned the C_CODE.
15: **
16: ** Returns:
17: ** Lexical tokens.
18: **
19: ** Side Effects:
20: ** Copies C code out on call after seeing it.
21: ** Puts terminals in symbol space.
22: **
23: ** Called By:
24: ** Yacc internals (yyparse()).
25: */
26:
27:
28:
29: yylex()
30: {
31: register int rtval;
32: register char chr;
33:
34:
35:
36: /* get next token */
37: rtval = CONTINUE;
38:
39: while (rtval == CONTINUE)
40: {
41: if (C_code_flg)
42: {
43: copy_c_code();
44: Newline = 1;
45: }
46: Pre_proc_flg = 0;
47:
48: /* END OF FILE ? */
49: if ((chr = getch()) == EOF_TOK)
50: {
51: # ifdef xDEBUG
52: if (Lex_debug)
53: printf("end of file\n");
54: # endif
55: return (0);
56: }
57:
58: /* Test for a line of C code */
59: if (Newline && if_c_code(chr))
60: {
61: if (C_code_flg)
62: continue;
63: rtval = Tokens.sp_c_code;
64: C_code_flg = 1;
65: break;
66: }
67: else
68: {
69: C_code_flg = 0;
70: if (Newline)
71: {
72: Newline = 0;
73: continue;
74: }
75: }
76:
77: /* CARRIAGE CONTROL ? */
78: Newline = chr == '\n';
79:
80: switch (Cmap [chr])
81: {
82:
83: case PUNCT :
84: continue;
85:
86: case OPATR :
87: rtval = operator(chr);
88: break;
89:
90: case NUMBR :
91: rtval = number(chr);
92: break;
93:
94: case ALPHA :
95: rtval = name(chr);
96: break;
97:
98: }
99: }
100: if (Lex_debug)
101: printf("YYLEX : '%s'\n",
102: yylval.u_dn ? yylval.u_dn->d_elm : "");
103: return (rtval);
104: }
105: /*
106: ** COPY_C_CODE -- Copies out a line of C code
107: ** The test for Charcnt != 0 is beacuse if a C pre-processor
108: ** line follows an equel line, and equate_lines() puts out no
109: ** newline, the initial '#' will not be on the beginning of
110: ** the line. As is, if this should happen, then the line
111: ** with the '#' will be one line in the output ahead of
112: ** where it should be.
113: */
114:
115:
116: copy_c_code()
117: {
118: char ch [2];
119:
120:
121: ch [1] = 0;
122: equate_lines();
123: if (Pre_proc_flg)
124: {
125: if (Charcnt != 0)
126: w_raw("\n");
127: w_raw("#");
128: }
129: do
130: {
131: if ((*ch = getch()) == EOF_TOK)
132: return;
133: w_raw(ch);
134: } while (*ch != '\n');
135: }
136: /*
137: ** IF_C_CODE -- Test to see if a line is C code
138: **
139: ** Sees if a line begins with "##" to see if it is equel.
140: **
141: ** Parameters:
142: ** chr -- first char of line
143: **
144: ** Returns:
145: ** 0 -- Quel line
146: ** 1 -- C line
147: **
148: ** Called By:
149: ** yylex()
150: */
151:
152:
153: if_c_code(chr)
154: char chr;
155: {
156: for ( ; ; )
157: {
158: if (chr != '#')
159: {
160: backup(chr);
161: return (1);
162: }
163: Pre_proc_flg = 1;
164: if ((chr = getch()) == EOF_TOK)
165: {
166: return (0);
167: }
168: if (chr != '#')
169: {
170: backup(chr);
171: return (1);
172: }
173: else
174: {
175: return (0);
176: }
177: }
178: }
Defined functions
yylex
defined in line
7; used 1 times