diff options
Diffstat (limited to 'bin/sh/arith.y')
-rw-r--r-- | bin/sh/arith.y | 67 |
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; |