# HG changeset patch # User jwe # Date 769827988 0 # Node ID fa0453b254106a3a934515f1f94e361a6c6a5ecc # Parent a222980dfa552c130e560a8dfe55c309b79e45d1 [project @ 1994-05-25 01:06:28 by jwe] diff --git a/src/lex.l b/src/lex.l --- a/src/lex.l +++ b/src/lex.l @@ -29,6 +29,7 @@ %s MATRIX %{ +#define SHORT_CIRCUIT_LOGICALS 1 #ifdef HAVE_CONFIG_H #include "config.h" @@ -543,8 +544,20 @@ "!=" { BIN_OP_RETURN (EXPR_NE, 0); } "<>" { BIN_OP_RETURN (EXPR_NE, 0); } ">=" { BIN_OP_RETURN (EXPR_GE, 0); } -"||" { BIN_OP_RETURN (EXPR_OR, 0); } -"&&" { BIN_OP_RETURN (EXPR_AND, 0); } +"||" { +#ifdef SHORT_CIRCUIT_LOGICALS + BIN_OP_RETURN (EXPR_OR_OR, 0); +#else + BIN_OP_RETURN (EXPR_OR, 0); +#endif + } +"&&" { +#ifdef SHORT_CIRCUIT_LOGICALS + BIN_OP_RETURN (EXPR_AND_AND, 0); +#else + BIN_OP_RETURN (EXPR_AND, 0); +#endif + } "|" { BIN_OP_RETURN (EXPR_OR, 0); } "&" { BIN_OP_RETURN (EXPR_AND, 0); } "!" { diff --git a/src/parse.y b/src/parse.y --- a/src/parse.y +++ b/src/parse.y @@ -165,6 +165,7 @@ // Tokens with line and column information. %token '=' ':' '-' '+' '*' '/' +%token EXPR_AND_AND EXPR_OR_OR %token EXPR_AND EXPR_OR EXPR_NOT %token EXPR_LT EXPR_LE EXPR_EQ EXPR_NE EXPR_GE EXPR_GT %token LEFTDIV EMUL EDIV ELEFTDIV QUOTE TRANSPOSE @@ -210,6 +211,7 @@ // Precedence and associativity. %left ';' ',' '\n' %right '=' +%left EXPR_AND_AND EXPR_OR_OR %left EXPR_AND EXPR_OR %left EXPR_LT EXPR_LE EXPR_EQ EXPR_NE EXPR_GE EXPR_GT %left ':' @@ -751,6 +753,12 @@ | simple_expr EXPR_NE simple_expr { $$ = new tree_binary_expression ($1, $3, tree::cmp_ne, $2->line (), $2->column ()); } + | simple_expr EXPR_AND_AND simple_expr + { $$ = new tree_binary_expression + ($1, $3, tree::and_and, $2->line (), $2->column ()); } + | simple_expr EXPR_OR_OR simple_expr + { $$ = new tree_binary_expression + ($1, $3, tree::or_or, $2->line (), $2->column ()); } | simple_expr EXPR_AND simple_expr { $$ = new tree_binary_expression ($1, $3, tree::and, $2->line (), $2->column ()); } diff --git a/src/pt-base.h b/src/pt-base.h --- a/src/pt-base.h +++ b/src/pt-base.h @@ -77,6 +77,8 @@ cmp_ge, cmp_gt, cmp_ne, + and_and, + or_or, and, or, not, diff --git a/src/pt-const.h b/src/pt-const.h --- a/src/pt-const.h +++ b/src/pt-const.h @@ -465,6 +465,8 @@ tree_constant convert_to_str (void); + int is_true (void) const; + tree_constant cumprod (void) const; tree_constant cumsum (void) const; tree_constant prod (void) const; @@ -721,6 +723,8 @@ tree_constant convert_to_str (void) { return rep->convert_to_str (); } + int is_true (void) const { return rep->is_true (); } + tree_constant cumprod (void) const { return rep->cumprod (); } tree_constant cumsum (void) const { return rep->cumsum (); } tree_constant prod (void) const { return rep->prod (); }