VirtualBox

source: kBuild/trunk/src/kash/arith.y@ 1784

Last change on this file since 1784 was 1233, checked in by bird, 17 years ago

keywords.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Id
File size: 4.9 KB
Line 
1%{
2/* $NetBSD: arith.y,v 1.17 2003/09/17 17:33:36 jmmv Exp $ */
3
4/*-
5 * Copyright (c) 1993
6 * The Regents of the University of California. All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Kenneth Almquist.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36#if 0
37#ifndef lint
38static char sccsid[] = "@(#)arith.y 8.3 (Berkeley) 5/4/95";
39#else
40__RCSID("$NetBSD: arith.y,v 1.17 2003/09/17 17:33:36 jmmv Exp $");
41#endif /* not lint */
42#endif
43
44#include <stdlib.h>
45#include "expand.h"
46#include "shell.h"
47#include "error.h"
48#include "output.h"
49#include "memalloc.h"
50#include "shinstance.h"
51
52shinstance *arith_psh;
53const char *arith_buf, *arith_startbuf;
54
55void yyerror(const char *);
56#ifdef TESTARITH
57int main(int , char *[]);
58int error(char *);
59#endif
60
61%}
62%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN
63
64%left ARITH_OR
65%left ARITH_AND
66%left ARITH_BOR
67%left ARITH_BXOR
68%left ARITH_BAND
69%left ARITH_EQ ARITH_NE
70%left ARITH_LT ARITH_GT ARITH_GE ARITH_LE
71%left ARITH_LSHIFT ARITH_RSHIFT
72%left ARITH_ADD ARITH_SUB
73%left ARITH_MUL ARITH_DIV ARITH_REM
74%left ARITH_UNARYMINUS ARITH_UNARYPLUS ARITH_NOT ARITH_BNOT
75%%
76
77exp: expr {
78 return ($1);
79 }
80 ;
81
82
83expr: ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; }
84 | expr ARITH_OR expr { $$ = $1 ? $1 : $3 ? $3 : 0; }
85 | expr ARITH_AND expr { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; }
86 | expr ARITH_BOR expr { $$ = $1 | $3; }
87 | expr ARITH_BXOR expr { $$ = $1 ^ $3; }
88 | expr ARITH_BAND expr { $$ = $1 & $3; }
89 | expr ARITH_EQ expr { $$ = $1 == $3; }
90 | expr ARITH_GT expr { $$ = $1 > $3; }
91 | expr ARITH_GE expr { $$ = $1 >= $3; }
92 | expr ARITH_LT expr { $$ = $1 < $3; }
93 | expr ARITH_LE expr { $$ = $1 <= $3; }
94 | expr ARITH_NE expr { $$ = $1 != $3; }
95 | expr ARITH_LSHIFT expr { $$ = $1 << $3; }
96 | expr ARITH_RSHIFT expr { $$ = $1 >> $3; }
97 | expr ARITH_ADD expr { $$ = $1 + $3; }
98 | expr ARITH_SUB expr { $$ = $1 - $3; }
99 | expr ARITH_MUL expr { $$ = $1 * $3; }
100 | expr ARITH_DIV expr {
101 if ($3 == 0)
102 yyerror("division by zero");
103 $$ = $1 / $3;
104 }
105 | expr ARITH_REM expr {
106 if ($3 == 0)
107 yyerror("division by zero");
108 $$ = $1 % $3;
109 }
110 | ARITH_NOT expr { $$ = !($2); }
111 | ARITH_BNOT expr { $$ = ~($2); }
112 | ARITH_SUB expr %prec ARITH_UNARYMINUS { $$ = -($2); }
113 | ARITH_ADD expr %prec ARITH_UNARYPLUS { $$ = $2; }
114 | ARITH_NUM
115 ;
116%%
117int
118arith(shinstance *psh, const char *s)
119{
120 long result;
121
122 INTOFF;
123/* todo lock */
124 arith_psh = psh;
125 arith_buf = arith_startbuf = s;
126 result = yyparse();
127 arith_lex_reset(); /* reprime lex */
128 arith_psh = NULL;
129/* todo unlock */
130 INTON;
131
132 return (result);
133}
134
135
136/*
137 * The exp(1) builtin.
138 */
139int
140expcmd(shinstance *psh, int argc, char **argv)
141{
142 const char *p;
143 char *concat;
144 char **ap;
145 long i;
146
147 if (argc > 1) {
148 p = argv[1];
149 if (argc > 2) {
150 /*
151 * concatenate arguments
152 */
153 STARTSTACKSTR(psh, concat);
154 ap = argv + 2;
155 for (;;) {
156 while (*p)
157 STPUTC(psh, *p++, concat);
158 if ((p = *ap++) == NULL)
159 break;
160 STPUTC(psh, ' ', concat);
161 }
162 STPUTC(psh, '\0', concat);
163 p = grabstackstr(psh, concat);
164 }
165 } else
166 p = "";
167
168 i = arith(psh, p);
169
170 out1fmt(psh, "%ld\n", i);
171 return (! i);
172}
173
174/*************************/
175#ifdef TEST_ARITH
176#include <stdio.h>
177main(argc, argv)
178 char *argv[];
179{
180 printf("%d\n", exp(argv[1]));
181}
182error(s)
183 char *s;
184{
185 fprintf(stderr, "exp: %s\n", s);
186 exit(1);
187}
188#endif
189
190void
191yyerror(const char *s)
192{
193 shinstance *psh = arith_psh;
194 yyerrok;
195 yyclearin;
196 arith_lex_reset(); /* reprime lex */
197/** @todo unlock */
198 error(psh, "arithmetic expression: %s: \"%s\"", s, arith_startbuf);
199 /* NOTREACHED */
200}
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette