diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-18 01:56:47 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-02-18 01:56:47 +0000 |
commit | a9662810df18371af7492dd8298cc0cccc13c7c7 (patch) | |
tree | 5a1131ad0ca461f67177e1c7282eacc92356f864 /parse.y | |
parent | 14aa2e8dda852b6b9277a8a7e16a78654edf1767 (diff) |
1.1b8pre1
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@76 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r-- | parse.y | 90 |
1 files changed, 51 insertions, 39 deletions
@@ -192,6 +192,7 @@ static void top_local_setup(); %token AREF ASET /* [] and []= */ %token LSHFT RSHFT /* << and >> */ %token COLON2 /* :: */ +%token COLON3 /* :: at EXPR_BEG */ %token <id> OP_ASGN /* +=, -= etc. */ %token ASSOC /* => */ %token KW_ASSOC /* -> */ @@ -808,8 +809,13 @@ primary : literal } | primary COLON2 cname { + value_expr($1); $$ = NEW_COLON2($1, $3); } + | COLON3 cname + { + $$ = NEW_COLON3($2); + } | STRING { $$ = NEW_STR($1); @@ -1261,7 +1267,7 @@ superclass : term { $$ = $3; } - | error term {yyerrok; $$ = 0} + | error term {yyerrok; $$ = 0;} f_arglist : '(' f_args ')' { @@ -2567,6 +2573,11 @@ retry: case ':': c = nextc(); if (c == ':') { + if (lex_state == EXPR_BEG || + (lex_state == EXPR_ARG && space_seen)) { + lex_state = EXPR_BEG; + return COLON3; + } lex_state = EXPR_BEG; return COLON2; } @@ -3422,43 +3433,6 @@ value_expr(node) static NODE *cond2(); -static NODE* -cond0(node) - NODE *node; -{ - enum node_type type = nd_type(node); - - switch (type) { - case NODE_DREGX: - case NODE_DREGX_ONCE: - local_cnt('_'); - local_cnt('~'); - return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_"))); - - case NODE_DOT2: - case NODE_DOT3: - node->nd_beg = cond2(node->nd_beg); - node->nd_end = cond2(node->nd_end); - if (type == NODE_DOT2) nd_set_type(node,NODE_FLIP2); - else if (type == NODE_DOT3) nd_set_type(node, NODE_FLIP3); - return node; - - case NODE_LIT: - if (TYPE(node->nd_lit) == T_REGEXP) { - local_cnt('_'); - local_cnt('~'); - return NEW_MATCH(node); - } - if (TYPE(node->nd_lit) == T_STRING) { - local_cnt('_'); - local_cnt('~'); - return NEW_MATCH(reg_new(RSTRING(node)->ptr,RSTRING(node)->len,0)); - } - default: - return node; - } -} - int assign_in_cond(node) NODE *node; @@ -3474,6 +3448,8 @@ assign_in_cond(node) case NODE_IASGN: case NODE_CASGN: break; + case NODE_NEWLINE: + default: return 1; } @@ -3500,12 +3476,48 @@ assign_in_cond(node) } static NODE* -cond(node) +cond0(node) NODE *node; { enum node_type type = nd_type(node); if (assign_in_cond(node) == 0) return 0; + switch (type) { + case NODE_DREGX: + case NODE_DREGX_ONCE: + local_cnt('_'); + local_cnt('~'); + return NEW_MATCH2(node, NEW_GVAR(rb_intern("$_"))); + + case NODE_DOT2: + case NODE_DOT3: + node->nd_beg = cond2(node->nd_beg); + node->nd_end = cond2(node->nd_end); + if (type == NODE_DOT2) nd_set_type(node,NODE_FLIP2); + else if (type == NODE_DOT3) nd_set_type(node, NODE_FLIP3); + return node; + + case NODE_LIT: + if (TYPE(node->nd_lit) == T_REGEXP) { + local_cnt('_'); + local_cnt('~'); + return NEW_MATCH(node); + } + if (TYPE(node->nd_lit) == T_STRING) { + local_cnt('_'); + local_cnt('~'); + return NEW_MATCH(reg_new(RSTRING(node)->ptr,RSTRING(node)->len,0)); + } + default: + return node; + } +} + +static NODE* +cond(node) + NODE *node; +{ + if (node == 0) return 0; if (nd_type(node) == NODE_NEWLINE){ node->nd_next = cond0(node->nd_next); return node; |