summaryrefslogtreecommitdiffstats
path: root/bin/sh/arith.y
diff options
context:
space:
mode:
Diffstat (limited to 'bin/sh/arith.y')
-rw-r--r--bin/sh/arith.y67
1 files changed, 41 insertions, 26 deletions
diff --git a/bin/sh/arith.y b/bin/sh/arith.y
index b71be6b..0a08dc5 100644
--- a/bin/sh/arith.y
+++ b/bin/sh/arith.y
@@ -1,13 +1,16 @@
-%token ARITH_OR ARITH_AND ARITH_ADD ARITH_SUBT ARITH_MULT ARITH_DIV ARITH_REM ARITH_EQ ARITH_GT ARITH_GEQ ARITH_LT ARITH_LEQ ARITH_NEQ
-%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN ARITH_NOT ARITH_UNARYMINUS
+%token ARITH_NUM ARITH_LPAREN ARITH_RPAREN
%left ARITH_OR
%left ARITH_AND
-%left ARITH_EQ ARITH_NEQ
-%left ARITH_LT ARITH_GT ARITH_GEQ ARITH_LEQ
-%left ARITH_ADD ARITH_SUBT
-%left ARITH_MULT ARITH_DIV ARITH_REM
-%left ARITH_UNARYMINUS ARITH_NOT
+%left ARITH_BOR
+%left ARITH_BXOR
+%left ARITH_BAND
+%left ARITH_EQ ARITH_NE
+%left ARITH_LT ARITH_GT ARITH_GE ARITH_LE
+%left ARITH_LSHIFT ARITH_RSHIFT
+%left ARITH_ADD ARITH_SUB
+%left ARITH_MUL ARITH_DIV ARITH_REM
+%left ARITH_UNARYMINUS ARITH_UNARYPLUS ARITH_NOT ARITH_BNOT
%%
exp: expr = {
@@ -17,25 +20,36 @@ exp: expr = {
expr: ARITH_LPAREN expr ARITH_RPAREN = { $$ = $2; }
- | expr ARITH_OR expr = { $$ = $1 ? $1 : $3 ? $3 : 0; }
- | expr ARITH_AND expr = { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; }
- | expr ARITH_EQ expr = { $$ = $1 == $3; }
- | expr ARITH_GT expr = { $$ = $1 > $3; }
- | expr ARITH_GEQ expr = { $$ = $1 >= $3; }
- | expr ARITH_LT expr = { $$ = $1 < $3; }
- | expr ARITH_LEQ expr = { $$ = $1 <= $3; }
- | expr ARITH_NEQ expr = { $$ = $1 != $3; }
- | expr ARITH_ADD expr = { $$ = $1 + $3; }
- | expr ARITH_SUBT expr = { $$ = $1 - $3; }
- | expr ARITH_MULT expr = { $$ = $1 * $3; }
- | expr ARITH_DIV expr = {
+ | expr ARITH_OR expr = { $$ = $1 ? $1 : $3 ? $3 : 0; }
+ | expr ARITH_AND expr = { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; }
+ | expr ARITH_BOR expr = { $$ = $1 | $3; }
+ | expr ARITH_BXOR expr = { $$ = $1 ^ $3; }
+ | expr ARITH_BAND expr = { $$ = $1 & $3; }
+ | expr ARITH_EQ expr = { $$ = $1 == $3; }
+ | expr ARITH_GT expr = { $$ = $1 > $3; }
+ | expr ARITH_GE expr = { $$ = $1 >= $3; }
+ | expr ARITH_LT expr = { $$ = $1 < $3; }
+ | expr ARITH_LE expr = { $$ = $1 <= $3; }
+ | expr ARITH_NE expr = { $$ = $1 != $3; }
+ | expr ARITH_LSHIFT expr = { $$ = $1 << $3; }
+ | expr ARITH_RSHIFT expr = { $$ = $1 >> $3; }
+ | expr ARITH_ADD expr = { $$ = $1 + $3; }
+ | expr ARITH_SUB expr = { $$ = $1 - $3; }
+ | expr ARITH_MUL expr = { $$ = $1 * $3; }
+ | expr ARITH_DIV expr = {
if ($3 == 0)
yyerror("division by zero");
$$ = $1 / $3;
}
- | expr ARITH_REM expr = { $$ = $1 % $3; }
+ | expr ARITH_REM expr = {
+ if ($3 == 0)
+ yyerror("division by zero");
+ $$ = $1 % $3;
+ }
| ARITH_NOT expr = { $$ = !($2); }
- | ARITH_UNARYMINUS expr = { $$ = -($2); }
+ | ARITH_BNOT expr = { $$ = ~($2); }
+ | ARITH_SUB expr %prec ARITH_UNARYMINUS = { $$ = -($2); }
+ | ARITH_ADD expr %prec ARITH_UNARYPLUS = { $$ = $2; }
| ARITH_NUM
;
%%
@@ -74,11 +88,11 @@ expr: ARITH_LPAREN expr ARITH_RPAREN = { $$ = $2; }
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id$
+ * $Id: arith.y,v 1.2 1994/09/24 02:57:21 davidg Exp $
*/
#ifndef lint
-static char sccsid[] = "@(#)arith.y 8.1 (Berkeley) 5/31/93";
+static char sccsid[] = "@(#)arith.y 8.3 (Berkeley) 5/4/95";
#endif /* not lint */
#include "shell.h"
@@ -88,13 +102,12 @@ static char sccsid[] = "@(#)arith.y 8.1 (Berkeley) 5/31/93";
char *arith_buf, *arith_startbuf;
+int
arith(s)
char *s;
{
- extern arith_wasoper;
long result;
- arith_wasoper = 1;
arith_buf = arith_startbuf = s;
INTOFF;
@@ -105,10 +118,10 @@ arith(s)
return (result);
}
+void
yyerror(s)
char *s;
{
- extern yytext, yylval;
yyerrok;
yyclearin;
@@ -119,7 +132,9 @@ yyerror(s)
/*
* The exp(1) builtin.
*/
+int
expcmd(argc, argv)
+ int argc;
char **argv;
{
char *p;
OpenPOWER on IntegriCloud