summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-18 01:56:47 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-18 01:56:47 +0000
commita9662810df18371af7492dd8298cc0cccc13c7c7 (patch)
tree5a1131ad0ca461f67177e1c7282eacc92356f864 /parse.y
parent14aa2e8dda852b6b9277a8a7e16a78654edf1767 (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.y90
1 files changed, 51 insertions, 39 deletions
diff --git a/parse.y b/parse.y
index 433185778d..761b2c811b 100644
--- a/parse.y
+++ b/parse.y
@@ -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;