# HG changeset patch # User jwe # Date 798737484 0 # Node ID cbdf7db9855476c5e882b57335ff93d458df7ea8 # Parent d607adf5af66fc94d8b342d6b37b3a9fba48c3d4 [project @ 1995-04-24 15:31:24 by jwe] diff -r d607adf5af66 -r cbdf7db98554 src/lex.l --- a/src/lex.l Fri Apr 21 19:59:03 1995 +0000 +++ b/src/lex.l Mon Apr 24 15:31:24 1995 +0000 @@ -142,8 +142,6 @@ NOTEQ ((~=)|(!=)|(<>)) POW ((\*\*)|(\^)) EPOW (\.{POW}) -PLUS ((\+)|(\.\+)) -MINUS ((\-)|(\.\-)) NOT ((\~)|(\!)) IDENT ([_a-zA-Z][_a-zA-Z0-9]*) EXPON ([DdEe][+-]?{D}+) @@ -503,6 +501,8 @@ // Other operators. %} +".+" { BIN_OP_RETURN (EPLUS, 0); } +".-" { BIN_OP_RETURN (EMINUS, 0); } ".*" { BIN_OP_RETURN (EMUL, 0); } "./" { BIN_OP_RETURN (EDIV, 0); } ".\\" { BIN_OP_RETURN (ELEFTDIV, 0); } @@ -548,13 +548,13 @@ BIN_OP_RETURN (EXPR_NOT, 0); } -{PLUS} { +"+" { if (plotting && ! in_plot_range) past_plot_range = 1; BIN_OP_RETURN ('+', 0); } -{MINUS} { +"-" { if (plotting && ! in_plot_range) past_plot_range = 1; BIN_OP_RETURN ('-', 0); @@ -1239,96 +1239,49 @@ // Try to determine if the next token should be treated as a binary // operator. This is even uglier, but it also seems to do the right -// thing. +// thing. Note that it is only necessary to check the spacing for `+' +// and `-', since those are the only tokens that can appear as unary +// ops too. static int next_token_is_bin_op (int spc_prev, char *yytext) { int bin_op = 0; - int spc_next = 0; int c0 = yyinput (); - int c1 = yyinput (); switch (c0) { case '+': case '-': + { + int c1 = yyinput (); + yyunput (c1, yytext); + int spc_next = (c1 == ' ' || c1 == '\t'); + bin_op = looks_like_bin_op (spc_prev, spc_next); + } + break; + case '/': case ':': case '\\': case '^': - spc_next = (c1 == ' ' || c1 == '\t'); - break; - case '&': - if (c1 == '&') - spc_next = next_char_is_space (); - else - spc_next = (c1 == ' ' || c1 == '\t'); - break; - case '*': - if (c1 == '*') - spc_next = next_char_is_space (); - else - spc_next = (c1 == ' ' || c1 == '\t'); - break; - case '|': - if (c1 == '|') - spc_next = next_char_is_space (); - else - spc_next = (c1 == ' ' || c1 == '\t'); - break; - case '<': - if (c1 == '=' || c1 == '>') - spc_next = next_char_is_space (); - else - spc_next = (c1 == ' ' || c1 == '\t'); - break; - case '>': - if (c1 == '=') - spc_next = next_char_is_space (); - else - spc_next = (c1 == ' ' || c1 == '\t'); - break; - case '~': case '!': case '=': - if (c1 == '=') - spc_next = next_char_is_space (); - else - goto done; - break; - case '.': - if (c1 == '*') - { - int c2 = yyinput (); - if (c2 == '*') - spc_next = next_char_is_space (); - else - spc_next = (c2 == ' ' || c2 == '\t'); - yyunput (c2, yytext); - } - else if (c1 == '/' || c1 == '\\' || c1 == '^') - spc_next = next_char_is_space (); - else - goto done; + bin_op = 1; break; default: - goto done; + break; } - bin_op = looks_like_bin_op (spc_prev, spc_next); - - done: - yyunput (c1, yytext); yyunput (c0, yytext); return bin_op; diff -r d607adf5af66 -r cbdf7db98554 src/parse.y --- a/src/parse.y Fri Apr 21 19:59:03 1995 +0000 +++ b/src/parse.y Mon Apr 24 15:31:24 1995 +0000 @@ -213,7 +213,8 @@ %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 +%token LEFTDIV EMUL EDIV ELEFTDIV EPLUS EMINUS +%token QUOTE TRANSPOSE %token PLUS_PLUS MINUS_MINUS POW EPOW %token NUM IMAG_NUM %token NAME SCREW @@ -271,7 +272,7 @@ %left EXPR_AND EXPR_OR %left EXPR_LT EXPR_LE EXPR_EQ EXPR_NE EXPR_GE EXPR_GT %left ':' -%left '-' '+' +%left '-' '+' EPLUS EMINUS %left '*' '/' LEFTDIV EMUL EDIV ELEFTDIV %left QUOTE TRANSPOSE %left UNARY PLUS_PLUS MINUS_MINUS EXPR_NOT @@ -767,6 +768,10 @@ { $$ = make_binary_op ('*', $1, $2, $3); } | simple_expr '/' simple_expr { $$ = make_binary_op ('/', $1, $2, $3); } + | simple_expr EPLUS simple_expr + { $$ = make_binary_op ('+', $1, $2, $3); } + | simple_expr EMINUS simple_expr + { $$ = make_binary_op ('-', $1, $2, $3); } | simple_expr EMUL simple_expr { $$ = make_binary_op (EMUL, $1, $2, $3); } | simple_expr EDIV simple_expr