VirtualBox

source: kBuild/trunk/src/ash/arith.y@ 1158

Last change on this file since 1158 was 809, checked in by bird, 18 years ago

Solaris + cleanup.

  • Property svn:eol-style set to native
File size: 4.7 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#ifdef HAVE_SYS_CDEFS_H
37#include <sys/cdefs.h>
38#endif
39#ifndef lint
40#if 0
41static char sccsid[] = "@(#)arith.y 8.3 (Berkeley) 5/4/95";
42#else
43__RCSID("$NetBSD: arith.y,v 1.17 2003/09/17 17:33:36 jmmv Exp $");
44#endif
45#endif /* not lint */
46
47#include <stdlib.h>
48#include "expand.h"
49#include "shell.h"
50#include "error.h"
51#include "output.h"
52#include "memalloc.h"
53
54const char *arith_buf, *arith_startbuf;
55
56void yyerror(const char *);
57#ifdef TESTARITH
58int main(int , char *[]);
59int error(char *);
60#endif
61
62%}
63%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN
64
65%left ARITH_OR
66%left ARITH_AND
67%left ARITH_BOR
68%left ARITH_BXOR
69%left ARITH_BAND
70%left ARITH_EQ ARITH_NE
71%left ARITH_LT ARITH_GT ARITH_GE ARITH_LE
72%left ARITH_LSHIFT ARITH_RSHIFT
73%left ARITH_ADD ARITH_SUB
74%left ARITH_MUL ARITH_DIV ARITH_REM
75%left ARITH_UNARYMINUS ARITH_UNARYPLUS ARITH_NOT ARITH_BNOT
76%%
77
78exp: expr {
79 return ($1);
80 }
81 ;
82
83
84expr: ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; }
85 | expr ARITH_OR expr { $$ = $1 ? $1 : $3 ? $3 : 0; }
86 | expr ARITH_AND expr { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; }
87 | expr ARITH_BOR expr { $$ = $1 | $3; }
88 | expr ARITH_BXOR expr { $$ = $1 ^ $3; }
89 | expr ARITH_BAND expr { $$ = $1 & $3; }
90 | expr ARITH_EQ expr { $$ = $1 == $3; }
91 | expr ARITH_GT expr { $$ = $1 > $3; }
92 | expr ARITH_GE expr { $$ = $1 >= $3; }
93 | expr ARITH_LT expr { $$ = $1 < $3; }
94 | expr ARITH_LE expr { $$ = $1 <= $3; }
95 | expr ARITH_NE expr { $$ = $1 != $3; }
96 | expr ARITH_LSHIFT expr { $$ = $1 << $3; }
97 | expr ARITH_RSHIFT expr { $$ = $1 >> $3; }
98 | expr ARITH_ADD expr { $$ = $1 + $3; }
99 | expr ARITH_SUB expr { $$ = $1 - $3; }
100 | expr ARITH_MUL expr { $$ = $1 * $3; }
101 | expr ARITH_DIV expr {
102 if ($3 == 0)
103 yyerror("division by zero");
104 $$ = $1 / $3;
105 }
106 | expr ARITH_REM expr {
107 if ($3 == 0)
108 yyerror("division by zero");
109 $$ = $1 % $3;
110 }
111 | ARITH_NOT expr { $$ = !($2); }
112 | ARITH_BNOT expr { $$ = ~($2); }
113 | ARITH_SUB expr %prec ARITH_UNARYMINUS { $$ = -($2); }
114 | ARITH_ADD expr %prec ARITH_UNARYPLUS { $$ = $2; }
115 | ARITH_NUM
116 ;
117%%
118int
119arith(s)
120 const char *s;
121{
122 long result;
123
124 arith_buf = arith_startbuf = s;
125
126 INTOFF;
127 result = yyparse();
128 arith_lex_reset(); /* reprime lex */
129 INTON;
130
131 return (result);
132}
133
134
135/*
136 * The exp(1) builtin.
137 */
138int
139expcmd(argc, argv)
140 int argc;
141 char **argv;
142{
143 const char *p;
144 char *concat;
145 char **ap;
146 long i;
147
148 if (argc > 1) {
149 p = argv[1];
150 if (argc > 2) {
151 /*
152 * concatenate arguments
153 */
154 STARTSTACKSTR(concat);
155 ap = argv + 2;
156 for (;;) {
157 while (*p)
158 STPUTC(*p++, concat);
159 if ((p = *ap++) == NULL)
160 break;
161 STPUTC(' ', concat);
162 }
163 STPUTC('\0', concat);
164 p = grabstackstr(concat);
165 }
166 } else
167 p = "";
168
169 i = arith(p);
170
171 out1fmt("%ld\n", i);
172 return (! i);
173}
174
175/*************************/
176#ifdef TEST_ARITH
177#include <stdio.h>
178main(argc, argv)
179 char *argv[];
180{
181 printf("%d\n", exp(argv[1]));
182}
183error(s)
184 char *s;
185{
186 fprintf(stderr, "exp: %s\n", s);
187 exit(1);
188}
189#endif
190
191void
192yyerror(s)
193 const char *s;
194{
195
196 yyerrok;
197 yyclearin;
198 arith_lex_reset(); /* reprime lex */
199 error("arithmetic expression: %s: \"%s\"", s, arith_startbuf);
200 /* NOTREACHED */
201}
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