summaryrefslogtreecommitdiff
path: root/parse.y
diff options
context:
space:
mode:
Diffstat (limited to 'parse.y')
-rw-r--r--parse.y62
1 files changed, 48 insertions, 14 deletions
diff --git a/parse.y b/parse.y
index 0aec9f1b3b..3dbc48f82a 100644
--- a/parse.y
+++ b/parse.y
@@ -3092,8 +3092,8 @@ yylex()
case '*':
if ((c = nextc()) == '*') {
if ((c = nextc()) == '=') {
- lex_state = EXPR_BEG;
yylval.id = tPOW;
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
pushback(c);
@@ -3184,8 +3184,9 @@ yylex()
c = nextc();
if (c == '<' &&
lex_state != EXPR_END &&
- lex_state != EXPR_ENDARG
- && lex_state != EXPR_CLASS &&
+ lex_state != EXPR_DOT &&
+ lex_state != EXPR_ENDARG &&
+ lex_state != EXPR_CLASS &&
(!IS_ARG() || space_seen)) {
int c2 = nextc();
int indent = 0;
@@ -3216,8 +3217,8 @@ yylex()
}
if (c == '<') {
if ((c = nextc()) == '=') {
- lex_state = EXPR_BEG;
yylval.id = tLSHFT;
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
pushback(c);
@@ -3238,8 +3239,8 @@ yylex()
}
if (c == '>') {
if ((c = nextc()) == '=') {
- lex_state = EXPR_BEG;
yylval.id = tRSHFT;
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
pushback(c);
@@ -3250,9 +3251,19 @@ yylex()
case '"':
return parse_string(c,c,0);
+
case '`':
- if (lex_state == EXPR_FNAME) return c;
- if (lex_state == EXPR_DOT) return c;
+ if (lex_state == EXPR_FNAME) {
+ lex_state = EXPR_END;
+ return c;
+ }
+ if (lex_state == EXPR_DOT) {
+ if (cmd_state)
+ lex_state = EXPR_CMDARG;
+ else
+ lex_state = EXPR_ARG;
+ return c;
+ }
return parse_string(c,c,0);
case '\'':
@@ -3268,12 +3279,32 @@ yylex()
rb_compile_error("incomplete character syntax");
return 0;
}
- if (IS_ARG() && ISSPACE(c)){
+ if (ISSPACE(c)){
+ if (!IS_ARG()){
+ int c = 0;
+ switch (c) {
+ case ' ':
+ c = 's';
+ break;
+ case '\n':
+ c = 'n';
+ break;
+ case '\t':
+ c = 't';
+ break;
+ case '\v':
+ c = 'v';
+ break;
+ }
+ if (c) {
+ rb_warn("invalid character syntax; use ?\\%c", c);
+ }
+ }
pushback(c);
lex_state = EXPR_BEG;
return '?';
}
- if (c == '\\') {
+ else if (c == '\\') {
c = read_escape();
}
c &= 0xff;
@@ -3286,6 +3317,7 @@ yylex()
lex_state = EXPR_BEG;
if ((c = nextc()) == '=') {
yylval.id = tANDOP;
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
pushback(c);
@@ -3320,14 +3352,15 @@ yylex()
lex_state = EXPR_BEG;
if ((c = nextc()) == '=') {
yylval.id = tOROP;
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
pushback(c);
return tOROP;
}
if (c == '=') {
- lex_state = EXPR_BEG;
yylval.id = '|';
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
if (lex_state == EXPR_FNAME || lex_state == EXPR_DOT) {
@@ -3350,8 +3383,8 @@ yylex()
return '+';
}
if (c == '=') {
- lex_state = EXPR_BEG;
yylval.id = '+';
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
if (lex_state == EXPR_BEG || lex_state == EXPR_MID ||
@@ -3380,8 +3413,8 @@ yylex()
return '-';
}
if (c == '=') {
- lex_state = EXPR_BEG;
yylval.id = '-';
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
if (lex_state == EXPR_BEG || lex_state == EXPR_MID ||
@@ -3630,8 +3663,8 @@ yylex()
return parse_regx('/', '/');
}
if ((c = nextc()) == '=') {
- lex_state = EXPR_BEG;
yylval.id = '/';
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
pushback(c);
@@ -3651,8 +3684,8 @@ yylex()
case '^':
if ((c = nextc()) == '=') {
- lex_state = EXPR_BEG;
yylval.id = '^';
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
switch (lex_state) {
@@ -3800,6 +3833,7 @@ yylex()
}
if ((c = nextc()) == '=') {
yylval.id = '%';
+ lex_state = EXPR_BEG;
return tOP_ASGN;
}
if (IS_ARG() && space_seen && !ISSPACE(c)) {