diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-13 09:40:29 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-13 09:40:29 +0000 |
commit | 1b7f82e62577986a6122ef453323ace74980d91e (patch) | |
tree | 3518499de338e8c28ec5daaa1396b381e9676e66 /parse.y | |
parent | 00080ffcbb05cf23bce8e31f0538567f5b780f89 (diff) |
\s and assignment in conditional
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@72 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 61 |
1 files changed, 45 insertions, 16 deletions
@@ -1684,6 +1684,9 @@ read_escape() case 'b': /* backspace */ return '\b'; + case 's': /* space */ + return ' '; + case 'M': if ((c = nextc()) != '-') { yyerror("Invalid escape character syntax"); @@ -1767,8 +1770,10 @@ parse_regx(term) break; case '\\': + case '^': /* no \^ escape in regexp */ + case 's': tokadd('\\'); - tokadd('\\'); + tokadd(c); break; case '1': case '2': case '3': @@ -1779,11 +1784,6 @@ parse_regx(term) tokadd(c); break; - case '^': /* no \^ escape in regexp */ - tokadd('\\'); - tokadd('^'); - break; - case 'b': if (!in_brack) { tokadd('\\'); @@ -2317,7 +2317,7 @@ retry: return '?'; } c = nextc(); - if (lex_state == EXPR_ARG && space_seen && isspace(c)){ + if (lex_state == EXPR_ARG && isspace(c)){ pushback(c); arg_ambiguous(); lex_state = EXPR_BEG; @@ -3459,28 +3459,57 @@ cond0(node) } } -static NODE* -cond(node) +int +assign_in_cond(node) NODE *node; { - enum node_type type = nd_type(node); - - switch (type) { + switch (nd_type(node)) { case NODE_MASGN: + Error("multiple assignment in conditional"); + return 0; + case NODE_LASGN: case NODE_DASGN: case NODE_GASGN: case NODE_IASGN: case NODE_CASGN: + break; + default: + return 1; + } + + switch (nd_type(node->nd_value)) { + case NODE_LIT: + case NODE_STR: + case NODE_DSTR: + case NODE_XSTR: + case NODE_DXSTR: + case NODE_EVSTR: + case NODE_DREGX: + case NODE_NIL: + case NODE_TRUE: + case NODE_FALSE: + Error("found = in conditional, should be =="); + return 0; + + default: Warning("assignment in condition"); break; - case NODE_NEWLINE: + } + if (assign_in_cond(node->nd_value)) return 1; +} + +static NODE* +cond(node) + NODE *node; +{ + enum node_type type = nd_type(node); + + if (assign_in_cond(node) == 0) return 0; + if (nd_type(node) == NODE_NEWLINE){ node->nd_next = cond0(node->nd_next); return node; - default: - break; } - return cond0(node); } |