|
|
1.1 root 1: %{
2: #include "y.tab.h"
3: #include "b.h"
4: #undef input
5: #define input() ninput()
6: #undef unput
7: #define unput(c) nunput(c)
8: extern int yylval;
9: #define xxbpmax 1700
10: char xxbuf[xxbpmax + 2];
11: int xxbp = -1;
12: #define xxunmax 200
13: char xxunbuf[xxunmax + 2];
14: int xxunbp = -1;
15:
16:
17: int blflag;
18: %}
19:
20: D [0-9]
21: A [0-9a-z]
22: L [a-z]
23: SP [^0-9a-z]
24:
25: %%
26:
27: %{
28: char *xxtbuff;
29: int xxj, xxn, xxk;
30: char *xxp;
31: %}
32: [=/,(]{D}+[h] {
33: blflag = 1;
34: sscanf(&yytext[1],"%d",&xxn);
35: xxtbuff = malloc(2*xxn+3);
36: for (xxj = xxk = 1; xxj <= xxn; ++xxj)
37: {
38: xxtbuff[xxk] = ninput();
39: if (xxtbuff[xxk] == '"')
40: xxtbuff[++xxk] = '"';
41: ++xxk;
42: }
43: xxtbuff[0] = xxtbuff[xxk++] = '"';
44: xxtbuff[xxk] = '\0';
45: putback(xxtbuff);
46: free(xxtbuff);
47:
48: backup(yytext[0]);
49: blflag = 0;
50: xxbp = -1;
51: }
52: IF {fixval(); xxbp = -1; return(xxif);}
53: ELSE {fixval(); xxbp = -1; return(xxelse);}
54: REPEAT {fixval(); xxbp = -1; return(xxrept); }
55: WHILE {fixval(); xxbp = -1; return(xxwhile); }
56: UNTIL { fixval(); xxbp = -1; return(xxuntil); }
57: DO {fixval(); xxbp = -1; return(xxdo); }
58: SWITCH {fixval(); xxbp = -1; return(xxswitch); }
59: CASE {fixval(); xxbp = -1; return(xxcase); }
60: DEFAULT {fixval(); xxbp = -1; return(xxdefault); }
61: END {fixval(); xxbp = -1; return(xxend); }
62:
63: ".true." |
64: ".false." |
65:
66: {L}{A}* {fixval(); xxbp = -1; return(xxident); }
67: ~{D}+ {xxbuf[0] = ' '; fixval(); xxbp = -1; return(xxnum); }
68: {D}+/"."(ge|gt|le|lt|eq|ne|not|or|and)"." |
69: {D}+\.? |
70: {D}+\.?[de][+-]?{D}+ |
71: {D}*\.{D}+[de][+-]?{D}+ |
72: {D}*\.{D}+ {fixval(); xxbp = -1; return(xxnum); }
73:
74: ".gt." { putback(">"); xxbp = -1; }
75: ".ge." { putback(">=");xxbp = -1; }
76: ".lt." { putback("<"); xxbp = -1; }
77: ".le." { putback("<="); xxbp = -1; }
78: ".eq." { putback("=="); xxbp = -1; }
79: ".ne." { putback("!="); xxbp = -1; }
80: ".not." { putback("!"); xxbp = -1; }
81: ".or." { putback("||"); xxbp = -1; }
82: ".and." { putback("&&"); xxbp = -1; }
83: ">=" {fixval(); xxbp = -1; return(xxge); }
84: "<=" {fixval(); xxbp = -1; return(xxle); }
85: == {fixval(); xxbp = -1; return(xxeq); }
86: != {fixval(); xxbp = -1; return(xxne); }
87: "||" {fixval(); xxbp = -1; return('|'); }
88: "&&" {fixval(); xxbp = -1; return('&'); }
89: "**" {fixval(); xxbp = -1; return('^'); }
90:
91: #.* {fixval(); xxbp = -1; return(xxcom); }
92: \"([^"]|\"\")*\" {fixval(); xxbp = -1; return(xxstring); }
93: '([^']|'')*' {
94: fixval();
95: xxp = yylval;
96: xxn = slength(xxp);
97: xxtbuff = malloc(2*xxn+1);
98: xxtbuff[0] = '"';
99: for (xxj = xxk = 1; xxj < xxn-1; ++xxj)
100: {
101: if (xxp[xxj] == '\'' && xxp[++xxj] == '\'')
102: xxtbuff[xxk++] = '\'';
103: else if (xxp[xxj] == '"')
104: {
105: xxtbuff[xxk++] = '"';
106: xxtbuff[xxk++] = '"';
107: }
108: else
109: xxtbuff[xxk++] = xxp[xxj];
110: }
111: xxtbuff[xxk++] = '"';
112: xxtbuff[xxk] = '\0';
113: free(xxp);
114: yylval = xxtbuff;
115: xxbp = -1;
116: return(xxstring);
117: }
118:
119: ^\n xxbp = -1;
120: \n {xxbp = -1; if (newflag) {fixval(); return('\n'); } }
121: {SP} {fixval(); xxbp = -1; return(yytext[0]); }
122:
123: %%
124:
125: rdchar()
126: {
127: int c;
128: if (xxunbp >= 0)
129: return(xxunbuf[xxunbp--]);
130: c = getchar();
131: if (c == EOF) return('\0');
132: else return((char)c);
133: }
134:
135: backup(c)
136: char c;
137: {
138: if (++xxunbp > xxunmax)
139: {
140: xxunbuf[xxunmax + 1] = '\0';
141: error("RATFOR beautifying; input backed up too far during lex:\n",
142: xxunbuf,"\n");
143: }
144: xxunbuf[xxunbp] = c;
145: }
146:
147: nunput(c)
148: char c;
149: {
150: backup(c);
151: if (xxbp < 0) return;
152: if (c != xxbuf[xxbp])
153: {
154: xxbuf[xxbp + 1] = '\0';
155: error("RATFOR beautifying; lex call of nunput with wrong char:\n",
156: xxbuf,"\n");
157: }
158: for ( --xxbp; xxbp >= 0 && (xxbuf[xxbp] == ' ' || xxbuf[xxbp] == '\t'); --xxbp)
159: backup(xxbuf[xxbp]);
160: xxbuf[xxbp+1] = '\0';
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.