Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20060805102429

Diff

Diff from 1.9 to:

Annotations

Annotate by Age | Author | Mixed | None
/fisheye/browse/pcc/pcc/cc/cpp/cpy.y

Annotated File View

ragge
1.9
1 /*      $Id: cpy.y,v 1.9 2006/08/05 10:24:29 ragge Exp $        */
ragge
1.1
2
3 /*
4  * Copyright (c) 2004 Anders Magnusson (ragge@ludd.luth.se).
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30 /*
31  * Copyright(C) Caldera International Inc. 2001-2002. All rights reserved.
32  *
33  * Redistribution and use in source and binary forms, with or without
34  * modification, are permitted provided that the following conditions
35  * are met:
36  *
37  * Redistributions of source code and documentation must retain the above
38  * copyright notice, this list of conditions and the following disclaimer.
39  * Redistributions in binary form must reproduce the above copyright
40  * notice, this list of conditions and the following disclaimer in the
41  * documentation and/or other materials provided with the distribution.
42  * All advertising materials mentioning features or use of this software
43  * must display the following acknowledgement:
44  *      This product includes software developed or owned by Caldera
45  *      International, Inc.
46  * Neither the name of Caldera International, Inc. nor the names of other
47  * contributors may be used to endorse or promote products derived from
48  * this software without specific prior written permission.
49  *
50  * USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA
51  * INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR
52  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
53  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
54  * DISCLAIMED.  IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE
55  * FOR ANY DIRECT, INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
57  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
58  * HOWEVER CAUSED AND ON ANY THEORY OFLIABILITY, WHETHER IN CONTRACT,
59  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
60  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
61  * POSSIBILITY OF SUCH DAMAGE.
62  */
63
64 %{
ragge
1.6
65 #include <stdlib.h>
ragge
1.2
66 #include <string.h>
ragge
1.1
67 int yylex2(void);
ragge
1.6
68 void yyerror(char *);
ragge
1.1
69 #define yylex yylex2
70 %}
71
72 %term number stop
73 %term EQ NE LE GE LS RS
74 %term ANDAND OROR
ragge
1.7
75
ragge
1.1
76 %left ','
77 %right '='
78 %right '?' ':'
79 %left OROR
80 %left ANDAND
81 %left '|' '^'
82 %left '&'
83 %binary EQ NE
84 %binary '<' '>' LE GE
85 %left LS RS
86 %left '+' '-'
87 %left '*' '/' '%'
88 %right '!' '~' UMINUS
89 %left '(' '.'
ragge
1.7
90
91 %union {
92         long long val;
93 }
94
95 %type <val> term number e
96
ragge
1.1
97 %%
ragge
1.7
98 S:      e stop  { return($1 != 0);}
ragge
1.1
99
100
101 e:        e '*' e
ragge
1.5
102                 {$$ = $1 * $3;}
ragge
1.1
103         | e '/' e
ragge
1.5
104                 {$$ = $1 / $3;}
ragge
1.1
105         | e '%' e
ragge
1.5
106                 {$$ = $1 % $3;}
ragge
1.1
107         | e '+' e
ragge
1.5
108                 {$$ = $1 + $3;}
ragge
1.1
109         | e '-' e
ragge
1.5
110                 {$$ = $1 - $3;}
ragge
1.1
111         | e LS e
ragge
1.5
112                 {$$ = $1 << $3;}
ragge
1.1
113         | e RS e
ragge
1.5
114                 {$$ = $1 >> $3;}
ragge
1.1
115         | e '<' e
ragge
1.5
116                 {$$ = $1 < $3;}
ragge
1.1
117         | e '>' e
ragge
1.5
118                 {$$ = $1 > $3;}
ragge
1.1
119         | e LE e
ragge
1.5
120                 {$$ = $1 <= $3;}
ragge
1.1
121         | e GE e
ragge
1.5
122                 {$$ = $1 >= $3;}
ragge
1.1
123         | e EQ e
ragge
1.5
124                 {$$ = $1 == $3;}
ragge
1.1
125         | e NE e
ragge
1.5
126                 {$$ = $1 != $3;}
ragge
1.1
127         | e '&' e
ragge
1.5
128                 {$$ = $1 & $3;}
ragge
1.1
129         | e '^' e
ragge
1.5
130                 {$$ = $1 ^ $3;}
ragge
1.1
131         | e '|' e
ragge
1.5
132                 {$$ = $1 | $3;}
ragge
1.1
133         | e ANDAND e
ragge
1.5
134                 {$$ = $1 && $3;}
ragge
1.1
135         | e OROR e
ragge
1.5
136                 {$$ = $1 || $3;}
ragge
1.1
137         | e '?' e ':' e
ragge
1.5
138                 {$$ = $1 ? $3 : $5;}
ragge
1.1
139         | e ',' e
ragge
1.5
140                 {$$ = $3;}
ragge
1.1
141         | term
ragge
1.5
142                 {$$ = $1;}
ragge
1.1
143 term:
144           '-' term %prec UMINUS
ragge
1.5
145                 {$$ = -$2;}
ragge
1.1
146         | '!' term
ragge
1.5
147                 {$$ = !$2;}
ragge
1.1
148         | '~' term
ragge
1.5
149                 {$$ = ~$2;}
ragge
1.1
150         | '(' e ')'
ragge
1.5
151                 {$$ = $2;}
ragge
1.1
152         | number
ragge
1.5
153                 {$$= $1;}
ragge
1.1
154 %%
155
156 #undef yylex
157 #include "cpp.h"
158
159 static int gotdef;
160
161 void
162 yyerror(char *err)
163 {
164         error(err);
165 }
166
ragge
1.4
167 static int
168 charcon(void)
169 {
170         char *wr = yystr;
171         int val;
172
173         wr++; /* skip first ' */
ragge
1.8
174         if (*wr++ == '\\') {
ragge
1.4
175                 switch (*wr++) {
176                 case 'a': val = '\a'; break;
177                 case 'b': val = '\b'; break;
178                 case 'f': val = '\f'; break;
179                 case 'n': val = '\n'; break;
180                 case 'r': val = '\r'; break;
181                 case 't': val = '\t'; break;
182                 case 'v': val = '\v'; break;
183                 case '\"': val = '\"'; break;
ragge
1.8
184                 case '\\': val = '\\'; break;
ragge
1.4
185                 case 'x': val = strtol(wr, &wr, 16); break;
186                 case '0': case '1': case '2': case '3': case '4': 
187                 case '5': case '6': case '7': case '8': case '9': 
188                         wr--;
189                         val = strtol(wr, &wr, 8);
190                         break;
191                 default: val = wr[-1];
192                 }
193         } else
194                 val = wr[-1];
195         return val;
196 }
197
ragge
1.1
198 int
199 yylex2(void)
200 {
201         struct symtab *nl;
202         int c;
203         usch *osp;
204
205 again:  c = yylex();
206         switch (c) {
207         case NUMBER:
ragge
1.7
208                 yylval.val = strtoll(yystr, 0, 0); /* XXX check errors */
ragge
1.1
209                 return number;
210
211         case WSPACE:
212                 goto again;
213
214         case IDENT:
215                 /* first check for the special "defined" keyword */
ragge
1.3
216                 if (strcmp(yystr, "defined") == 0) {
ragge
1.1
217                         int par, d;
218                         gotdef = 1;
219                         if ((par = c = yylex2()) == '(')
220                                 c = yylex2();
221                         if (c != IDENT)
222                                 goto bad;
ragge
1.3
223                         d = (lookup(yystr, FIND) != NULL);
ragge
1.1
224                         if (par == '(' && ((c = yylex2()) != ')'))
225                                 goto bad;
226                         gotdef = 0;
ragge
1.7
227                         yylval.val = d;
ragge
1.1
228                         return number;
229                 }
230                 if (gotdef)
231                         return IDENT;
232
233                 /* Is this a defined macro? */
ragge
1.7
234                 yylval.val = 0;
ragge
1.3
235                 if ((nl = lookup(yystr, FIND)) == NULL)
ragge
1.1
236                         return number;
237                 osp = stringbuf;
ragge
1.9
238 #ifdef ragge
239                 if (subst(nl, NULL) == 0)
240                         return number; /* failed substitution */
241 #else
ragge
1.3
242                 if (subst(yystr, nl, NULL) == 0)
ragge
1.1
243                         return number; /* failed substitution */
ragge
1.9
244 #endif
ragge
1.1
245                 while (stringbuf > osp)
246                         cunput(*--stringbuf);
247                 goto again;
248
249         case '=':
250                 if ((c = yylex()) == '=')
251                         return EQ;
252                 c = '=';
253                 break;
254
255         case '!':
256                 if ((c = yylex()) == '=')
257                         return NE;
258                 c = '!';
259                 break;
260
261         case '<':
262                 if ((c = yylex()) == '=')
263                         return LE;
264                 if (c == '<')
265                         return LS;
266                 c = '<';
267                 break;
268
269         case '>':
270                 if ((c = yylex()) == '=')
271                         return GE;
272                 if (c == '>')
273                         return RS;
274                 c = '>';
275                 break;
276
277         case '|':
278                 if ((c = yylex()) == '|')
279                         return OROR;
280                 c = '|';
281                 break;
282
283         case '&':
284                 if ((c = yylex()) == '&')
285                         return ANDAND;
286                 c = '&';
287                 break;
288
289         case NL:
290                 putc('\n', obuf);
291                 return stop;
292
ragge
1.4
293         case CHARCON:
ragge
1.7
294                 yylval.val = charcon();
ragge
1.4
295                 return number;
296
ragge
1.1
297         default:
298                 if (c < 256)
299                         return c;
300 bad:            error("bad #if token %d", c);
301         }
ragge
1.3
302         unpstr(yystr);
ragge
1.1
303         return c;
304 }
305 #define yylex yylex2
FishEye: Open Source License registered to PCC.
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2014-12-21 18:17 +0100