summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--defs/id.def2
-rw-r--r--parse.y29
2 files changed, 10 insertions, 21 deletions
diff --git a/defs/id.def b/defs/id.def
index dd0eed9b7c..b5815b7f00 100644
--- a/defs/id.def
+++ b/defs/id.def
@@ -44,6 +44,8 @@ firstline, predefined = __LINE__+1, %[\
mesg
exception
not NOT
+ and AND
+ or OR
_ UScore
"/*NULL*/" NULL
diff --git a/parse.y b/parse.y
index f488f7ac68..6b54a1ad7e 100644
--- a/parse.y
+++ b/parse.y
@@ -410,7 +410,9 @@ static NODE *new_if_gen(struct parser_params*,NODE*,NODE*,NODE*);
#define new_if(cc,left,right) new_if_gen(parser, (cc), (left), (right))
#define new_unless(cc,left,right) new_if_gen(parser, (cc), (right), (left))
static NODE *logop_gen(struct parser_params*,enum node_type,NODE*,NODE*);
-#define logop(type,node1,node2) logop_gen(parser, (type), (node1), (node2))
+#define logop(type,node1,node2) \
+ logop_gen(parser, (type)==tAND||(type)==tANDOP?NODE_AND:NODE_OR, \
+ (node1), (node2))
static NODE *newline_node(NODE*);
static void fixpos(NODE*,NODE*);
@@ -565,6 +567,7 @@ static int id_is_var_gen(struct parser_params *parser, ID id);
#define call_bin_op(recv,id,arg1) dispatch3(binary, (recv), STATIC_ID2SYM(id), (arg1))
#define match_op(node1,node2) call_bin_op((node1), idEqTilde, (node2))
#define call_uni_op(recv,id) dispatch2(unary, STATIC_ID2SYM(id), (recv))
+#define logop(type,node1,node2) call_bin_op((node1), TOKEN2ID(type), (node2))
#define node_assign(node1, node2) dispatch2(assign, (node1), (node2))
#define new_nil() Qnil
@@ -1421,19 +1424,11 @@ command_rhs : command_call %prec tOP_ASGN
expr : command_call
| expr keyword_and expr
{
- /*%%%*/
- $$ = logop(NODE_AND, $1, $3);
- /*%
- $$ = dispatch3(binary, $1, ripper_intern("and"), $3);
- %*/
+ $$ = logop(tAND, $1, $3);
}
| expr keyword_or expr
{
- /*%%%*/
- $$ = logop(NODE_OR, $1, $3);
- /*%
- $$ = dispatch3(binary, $1, ripper_intern("or"), $3);
- %*/
+ $$ = logop(tOR, $1, $3);
}
| keyword_not opt_nl expr
{
@@ -2209,19 +2204,11 @@ arg : lhs '=' arg_rhs
}
| arg tANDOP arg
{
- /*%%%*/
- $$ = logop(NODE_AND, $1, $3);
- /*%
- $$ = dispatch3(binary, $1, TOKEN2VAL(tANDOP), $3);
- %*/
+ $$ = logop(tANDOP, $1, $3);
}
| arg tOROP arg
{
- /*%%%*/
- $$ = logop(NODE_OR, $1, $3);
- /*%
- $$ = dispatch3(binary, $1, TOKEN2VAL(tOROP), $3);
- %*/
+ $$ = logop(tOROP, $1, $3);
}
| keyword_defined opt_nl {in_defined = 1;} arg
{