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