Quick Search:

View

Revision:
Expand:  
Changeset: MAIN:ragge:20090801155306

Diff

Diff from 1.17 to:

Annotations

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

Annotated File View

ragge
1.17
1 /*      $Id: cpy.y,v 1.17 2009/08/01 15:53:06 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 %{
otto
1.13
65
66 #include "cpp.h"
67
ragge
1.6
68 void yyerror(char *);
ragge
1.11
69 int yylex(void);
ragge
1.15
70 int setd(int l, int r);
71
72 #define EVALUNARY(tok, l, r) l.nd_val = tok r.nd_val; l.op = r.op
73 #define EVALBIN(tok, d, l, r)   \
74         d.op = setd(l.op, r.op); d.nd_val = l.nd_val tok r.nd_val
75 #define EVALUBIN(tok, d, l, r, t)                               \
76         d.op = setd(l.op, r.op);                                \
77         if (d.op == NUMBER) d.nd_val = l.nd_val tok r.nd_val;   \
78         else d.nd_uval = l.nd_uval tok r.nd_uval;               \
79         if (t && d.op) d.op = NUMBER
80 #define XEVALUBIN(tok, d, l, r)                                 \
81         if (r.nd_val) { EVALUBIN(tok, d, l, r, 0); } else d.op = 0
ragge
1.1
82 %}
83
ragge
1.10
84 %term stop
ragge
1.1
85 %term EQ NE LE GE LS RS
ragge
1.17
86 %term ANDAND OROR IDENT NUMBER UNUMBER DEFINED
ragge
1.10
87 /*
88  * The following terminals are not used in the yacc code.
89  */
ragge
1.17
90 %term STRING WSPACE CMNT
ragge
1.7
91
ragge
1.1
92 %left ','
93 %right '?' ':'
94 %left OROR
95 %left ANDAND
96 %left '|' '^'
97 %left '&'
98 %binary EQ NE
99 %binary '<' '>' LE GE
100 %left LS RS
101 %left '+' '-'
102 %left '*' '/' '%'
103 %right '!' '~' UMINUS
ragge
1.15
104 %left '('
ragge
1.7
105
106 %union {
ragge
1.15
107         struct nd node;
ragge
1.7
108 }
109
ragge
1.15
110 %type <node>    term e NUMBER UNUMBER
ragge
1.7
111
ragge
1.1
112 %%
ragge
1.15
113 S:      e '\n'  { 
114                 if ($1.op == 0)
115                         error("division by zero");
116                 return $1.nd_val;
117         }
ragge
1.1
118
119 e:        e '*' e
ragge
1.15
120                 { EVALUBIN(*, $$, $1, $3, 0); }
ragge
1.1
121         | e '/' e
ragge
1.15
122                 { XEVALUBIN(/, $$, $1, $3); }
ragge
1.1
123         | e '%' e
ragge
1.15
124                 { XEVALUBIN(%, $$, $1, $3); }
ragge
1.1
125         | e '+' e
ragge
1.15
126                 { EVALBIN(+, $$, $1, $3); }
ragge
1.1
127         | e '-' e
ragge
1.15
128                 { EVALBIN(-, $$, $1, $3); }
ragge
1.1
129         | e LS e
ragge
1.15
130                 { EVALBIN(<<, $$, $1, $3); }
ragge
1.1
131         | e RS e
ragge
1.15
132                 { EVALUBIN(>>, $$, $1, $3, 0); }
ragge
1.1
133         | e '<' e
ragge
1.15
134                 { EVALUBIN(<, $$, $1, $3, 1); }
ragge
1.1
135         | e '>' e
ragge
1.15
136                 { EVALUBIN(>, $$, $1, $3, 1); }
ragge
1.1
137         | e LE e
ragge
1.15
138                 { EVALUBIN(<=, $$, $1, $3, 1); }
ragge
1.1
139         | e GE e
ragge
1.15
140                 { EVALUBIN(>=, $$, $1, $3, 1); }
ragge
1.1
141         | e EQ e
ragge
1.15
142                 { EVALUBIN(==, $$, $1, $3, 1); }
ragge
1.1
143         | e NE e
ragge
1.15
144                 { EVALUBIN(!=, $$, $1, $3, 1); }
ragge
1.1
145         | e '&' e
ragge
1.15
146                 { EVALBIN(&, $$, $1, $3); }
ragge
1.1
147         | e '^' e
ragge
1.15
148                 { EVALBIN(^, $$, $1, $3); }
ragge
1.1
149         | e '|' e
ragge
1.15
150                 { EVALBIN(|, $$, $1, $3); }
151         | e ANDAND e {
152                 $$ = $1;
153                 if ($1.nd_val) {
154                         $$.op = setd($1.op, $3.op);
155                         $$.nd_val = ($3.nd_val != 0);
156                 }
157                 if ($$.op == UNUMBER) $$.op = NUMBER;
158         }
159         | e OROR e {
160                 if ($1.nd_val != 0) {
161                         $$.nd_val = ($1.nd_val != 0);
162                         $$.op = $1.op;
163                 } else {
164                         $$.nd_val = ($3.nd_val != 0);
165                         $$.op = setd($1.op, $3.op);
166                 }
167                 if ($$.op == UNUMBER) $$.op = NUMBER;
168         }
otto
1.13
169         | e '?' e ':' e {
ragge
1.15
170                 if ($1.op == 0)
171                         $$ = $1;
172                 else if ($1.nd_val)
173                         $$ = $3;
174                 else
175                         $$ = $5;
176         }
177         | e ',' e {
178                 $$.op = setd($1.op, $3.op);
179                 $$.nd_val = $3.nd_val;
180                 if ($$.op) $$.op =  $3.op;
181         }
ragge
1.1
182         | term
ragge
1.5
183                 {$$ = $1;}
ragge
1.1
184 term:
185           '-' term %prec UMINUS
ragge
1.15
186                 { EVALUNARY(-, $$, $2); }
otto
1.13
187         | '+' term %prec UMINUS
188                 {$$ = $2;}
ragge
1.1
189         | '!' term
ragge
1.15
190                 { $$.nd_val = ! $2.nd_val; $$.op = $2.op ? NUMBER : 0; }
ragge
1.1
191         | '~' term
ragge
1.15
192                 { EVALUNARY(~, $$, $2); }
ragge
1.1
193         | '(' e ')'
ragge
1.5
194                 {$$ = $2;}
ragge
1.17
195         | DEFINED '(' NUMBER ')'
196                 {$$= $3;}
197         | DEFINED NUMBER
198                 {$$ = $2;}
ragge
1.10
199         | NUMBER
ragge
1.15
200                 {$$ = $1;}
ragge
1.1
201 %%
202
203 void
204 yyerror(char *err)
205 {
206         error(err);
207 }
otto
1.13
208
ragge
1.15
209 /*
210  * Set return type of an expression.
211  */
212 int
213 setd(int l, int r)
otto
1.13
214 {
ragge
1.15
215         if (!l || !r)
216                 return 0; /* div by zero involved */
217         if (l == UNUMBER || r == UNUMBER)
218                 return UNUMBER;
219         return NUMBER;
otto
1.13
220 }
221
FishEye: Open Source License registered to PCC.
Your maintenance has expired. You can renew your license at http://www.atlassian.com/fisheye/renew
Atlassian FishEye, CVS analysis. (Version:1.6.3 Build:build-336 2008-11-04) - Administration - Page generated 2014-10-30 13:16 +0100