|
|
1.1 root 1: %{
2:
3: #ifndef lint
4: static char sccsid[] = "@(#)lextab.l 4.1 (Berkeley) 2/11/83";
5: #endif not lint
6:
7: #include "y.tab.h"
8: #include "b.h"
9: #undef input
10: #define input() ninput()
11: #undef unput
12: #define unput(c) nunput(c)
13: extern int yylval;
14: #define xxbpmax 1700
15: char xxbuf[xxbpmax + 2];
16: int xxbp = -1;
17: #define xxunmax 200
18: char xxunbuf[xxunmax + 2];
19: int xxunbp = -1;
20:
21:
22: int blflag;
23: %}
24:
25: D [0-9]
26: A [0-9a-z]
27: L [a-z]
28: SP [^0-9a-z]
29:
30: %%
31:
32: %{
33: char *xxtbuff;
34: int xxj, xxn, xxk;
35: char *xxp;
36: %}
37: [=/,(]{D}+[h] {
38: blflag = 1;
39: sscanf(&yytext[1],"%d",&xxn);
40: xxtbuff = malloc(2*xxn+3);
41: for (xxj = xxk = 1; xxj <= xxn; ++xxj)
42: {
43: xxtbuff[xxk] = ninput();
44: if (xxtbuff[xxk] == '"')
45: xxtbuff[++xxk] = '"';
46: ++xxk;
47: }
48: xxtbuff[0] = xxtbuff[xxk++] = '"';
49: xxtbuff[xxk] = '\0';
50: putback(xxtbuff);
51: free(xxtbuff);
52:
53: backup(yytext[0]);
54: blflag = 0;
55: xxbp = -1;
56: }
57: IF {fixval(); xxbp = -1; return(xxif);}
58: ELSE {fixval(); xxbp = -1; return(xxelse);}
59: REPEAT {fixval(); xxbp = -1; return(xxrept); }
60: WHILE {fixval(); xxbp = -1; return(xxwhile); }
61: UNTIL { fixval(); xxbp = -1; return(xxuntil); }
62: DO {fixval(); xxbp = -1; return(xxdo); }
63: SWITCH {fixval(); xxbp = -1; return(xxswitch); }
64: CASE {fixval(); xxbp = -1; return(xxcase); }
65: DEFAULT {fixval(); xxbp = -1; return(xxdefault); }
66: END {fixval(); xxbp = -1; return(xxend); }
67:
68: ".true." |
69: ".false." |
70:
71: {L}{A}* {fixval(); xxbp = -1; return(xxident); }
72: ~{D}+ {xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); }
73: {D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"." |
74: {D}+\.? |
75: {D}+\.?[de][+-]?{D}+ |
76: {D}*\.{D}+[de][+-]?{D}+ |
77: {D}*\.{D}+ {fixval(); xxbp = -1; return(xxnum); }
78:
79: ".gt." { putback(">"); xxbp = -1; }
80: ".ge." { putback(">=");xxbp = -1; }
81: ".lt." { putback("<"); xxbp = -1; }
82: ".le." { putback("<="); xxbp = -1; }
83: ".eq." { putback("=="); xxbp = -1; }
84: ".ne." { putback("!="); xxbp = -1; }
85: ".not." { putback("!"); xxbp = -1; }
86: ".or." { putback("||"); xxbp = -1; }
87: ".and." { putback("&&"); xxbp = -1; }
88: ">=" {fixval(); xxbp = -1; return(xxge); }
89: "<=" {fixval(); xxbp = -1; return(xxle); }
90: == {fixval(); xxbp = -1; return(xxeq); }
91: != {fixval(); xxbp = -1; return(xxne); }
92: "||" {fixval(); xxbp = -1; return('|'); }
93: "&&" {fixval(); xxbp = -1; return('&'); }
94: "**" {fixval(); xxbp = -1; return('^'); }
95:
96: #.* {fixval(); xxbp = -1; return(xxcom); }
97: \"([^"]|\"\")*\" {fixval(); xxbp = -1; return(xxstring); }
98: '([^']|'')*' {
99: fixval();
100: xxp = yylval;
101: xxn = slength(xxp);
102: xxtbuff = malloc(2*xxn+1);
103: xxtbuff[0] = '"';
104: for (xxj = xxk = 1; xxj < xxn-1; ++xxj)
105: {
106: if (xxp[xxj] == '\'' && xxp[++xxj] == '\'')
107: xxtbuff[xxk++] = '\'';
108: else if (xxp[xxj] == '"')
109: {
110: xxtbuff[xxk++] = '"';
111: xxtbuff[xxk++] = '"';
112: }
113: else
114: xxtbuff[xxk++] = xxp[xxj];
115: }
116: xxtbuff[xxk++] = '"';
117: xxtbuff[xxk] = '\0';
118: free(xxp);
119: yylval = xxtbuff;
120: xxbp = -1;
121: return(xxstring);
122: }
123:
124: ^\n xxbp = -1;
125: \n {xxbp = -1; if (newflag) {fixval(); return('\n'); } }
126: {SP} {fixval(); xxbp = -1; return(yytext[0]); }
127:
128: %%
129:
130: rdchar()
131: {
132: int c;
133: if (xxunbp >= 0)
134: return(xxunbuf[xxunbp--]);
135: c = getchar();
136: if (c == EOF) return('\0');
137: else return((char)c);
138: }
139:
140: backup(c)
141: char c;
142: {
143: if (++xxunbp > xxunmax)
144: {
145: xxunbuf[xxunmax + 1] = '\0';
146: error("RATFOR beautifying; input backed up too far during lex:\n",
147: xxunbuf,"\n");
148: }
149: xxunbuf[xxunbp] = c;
150: }
151:
152: nunput(c)
153: char c;
154: {
155: backup(c);
156: if (xxbp < 0) return;
157: if (c != xxbuf[xxbp])
158: {
159: xxbuf[xxbp + 1] = '\0';
160: error("RATFOR beautifying; lex call of nunput with wrong char:\n",
161: xxbuf,"\n");
162: }
163: for ( --xxbp; xxbp >= 0 && (xxbuf[xxbp] == ' ' || xxbuf[xxbp] == '\t'); --xxbp)
164: backup(xxbuf[xxbp]);
165: xxbuf[xxbp+1] = '\0';
166: }
167:
168: ninput()
169: {
170: char c,d;
171: if (blflag) c = rdchar();
172: else
173: while ( (c = rdchar()) == ' ' || c == '\t')
174: addbuf(c);
175: if (c != '\n')
176: return(addbuf(c));
177: while ( (d = rdchar()) == ' ' || d == '\t');
178: if (d == '&')
179: return(ninput());
180: backup(d);
181: return(addbuf('\n'));
182: }
183:
184: addbuf(c)
185: char c;
186: {
187: if (++xxbp > xxbpmax)
188: {
189: xxbuf[xxbpmax +1] = '\0';
190: error("RATFOR beautifying; buffer xxbuf too small for token beginning:\n",
191: xxbuf,"\n");
192: }
193: xxbuf[xxbp] = c;
194: xxbuf[xxbp + 1] = '\0';
195: return(c);
196: }
197:
198:
199: fixval()
200: {
201: int i, j, k;
202: for (j = 0; xxbuf[j] == ' ' || xxbuf[j] == '\t'; ++j);
203: for (k = j; xxbuf[k] != '\0'; ++k);
204: for (--k; k > j && xxbuf[k] == ' ' || xxbuf[k] == '\t'; --k);
205: xxbuf[k+1] = '\0';
206: i = slength(&xxbuf[j]) + 1;
207: yylval = malloc(i);
208: str_copy(&xxbuf[j],yylval,i);
209: }
210:
211:
212:
213: putback(str)
214: char *str;
215: {
216: int i;
217: for (i = 0; str[i] != '\0'; ++i);
218: for (--i; i >= 0; --i)
219: backup(str[i]);
220: }
221:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.