summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-26 07:43:11 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>1998-02-26 07:43:11 +0000
commiteeb804f153eff4bde9fc528414bfd9c8c8e343a1 (patch)
tree07f08eec5e3161b54324f0bdbe38f9ac4ed42f1c /parse.y
parentba2d46829afada0ecc878df16b04078b13c6cfd9 (diff)
*** empty log message ***
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1r@92 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y28
1 files changed, 24 insertions, 4 deletions
diff --git a/parse.y b/parse.y
index d36c3f7f54..e34eb57c6f 100644
--- a/parse.y
+++ b/parse.y
@@ -485,6 +485,11 @@ fname : IDENTIFIER
lex_state = EXPR_END;
$$ = $1;
}
+ | reswords
+ {
+ lex_state = EXPR_END;
+ $$ = $<id>1;
+ }
undef_list : fname
{
@@ -523,6 +528,14 @@ op : DOT2 { $$ = DOT2; }
| ASET { $$ = ASET; }
| '`' { $$ = '`'; }
+reswords : k__LINE__ | k__FILE__ | klBEGIN | klEND
+ | kALIAS | kAND | kBEGIN | kBREAK | kCASE | kCLASS | kDEF
+ | kDEFINED | kDO | kELSE | kELSIF | kEND | kENSURE | kFALSE
+ | kFOR | kIF_MOD | kIN | kMODULE | kNEXT | kNIL | kNOT
+ | kOR | kREDO | kRESCUE | kRETRY | kRETURN | kSELF | kSUPER
+ | kTHEN | kTRUE | kUNDEF | kUNLESS_MOD | kUNTIL_MOD | kWHEN
+ | kWHILE_MOD | kYIELD
+
arg : variable '=' arg
{
value_expr($3);
@@ -2586,12 +2599,16 @@ retry:
case ':':
c = nextc();
if (c == ':') {
- if (lex_state == EXPR_BEG ||
- (lex_state == EXPR_ARG && space_seen)) {
+ if (lex_state == EXPR_BEG) {
lex_state = EXPR_BEG;
return COLON3;
}
- lex_state = EXPR_BEG;
+ if (lex_state == EXPR_ARG && space_seen) {
+ arg_ambiguous();
+ lex_state = EXPR_BEG;
+ return COLON3;
+ }
+ lex_state = EXPR_DOT;
return COLON2;
}
pushback(c);
@@ -2877,12 +2894,15 @@ retry:
result = IVAR;
break;
default:
- if (lex_state != EXPR_FNAME && lex_state != EXPR_DOT) {
+ if (lex_state != EXPR_DOT) {
/* See if it is a reserved word. */
kw = rb_reserved_word(tok(), toklen());
if (kw) {
enum lex_state state = lex_state;
lex_state = kw->state;
+ if (lex_state == EXPR_FNAME) {
+ yylval.id = rb_intern(kw->name);
+ }
return kw->id[state != EXPR_BEG];
}
}