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