Commit | Line | Data |
---|---|---|
51733553 RH |
1 | %{ |
2 | ||
3 | #ifndef lint | |
4 | static char sccsid[] = "@(#)lextab.l 4.1 (Berkeley) %G%"; | |
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 |