aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-05-26 18:45:59 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-05-26 18:47:52 +0900
commit2ce6365f9ccd93e8129252429391118f794f5e0b (patch)
tree57e8631b7b739ad5022c0d3c748a6fbb7226dfd7
parent58308899151ee3d49f8d9ef5c4e8d108d8822525 (diff)
downloadruby-2ce6365f9ccd93e8129252429391118f794f5e0b.tar.gz
parse.y: adjust error indicator
* parse.y (parser_yylex): adjust the error indicator of unexpected fraction part. before: ~~~ 1.2.3 ^~~ ~~~ after: ~~~ 1.2.3 ^~ ~~~
-rw-r--r--parse.y20
-rw-r--r--test/irb/test_color.rb2
-rw-r--r--test/ruby/test_parse.rb3
3 files changed, 15 insertions, 10 deletions
diff --git a/parse.y b/parse.y
index fcd495969c..9036f58a59 100644
--- a/parse.y
+++ b/parse.y
@@ -7106,14 +7106,6 @@ number_literal_suffix(struct parser_params *p, int mask)
return 0;
}
pushback(p, c);
- if (c == '.') {
- c = peekc_n(p, 1);
- if (ISDIGIT(c)) {
- yyerror0("unexpected fraction part after numeric literal");
- p->lex.pcur += 2;
- while (parser_is_identchar(p)) nextc(p);
- }
- }
break;
}
return result;
@@ -8959,7 +8951,17 @@ parser_yylex(struct parser_params *p)
}
pushback(p, c);
if (c != -1 && ISDIGIT(c)) {
- yyerror0("no .<digit> floating literal anymore; put 0 before dot");
+ char prev = p->lex.pcur-1 > p->lex.pbeg ? *(p->lex.pcur-2) : 0;
+ parse_numeric(p, '.');
+ if (ISDIGIT(prev)) {
+ yyerror0("unexpected fraction part after numeric literal");
+ }
+ else {
+ yyerror0("no .<digit> floating literal anymore; put 0 before dot");
+ }
+ SET_LEX_STATE(EXPR_END);
+ p->lex.ptok = p->lex.pcur;
+ goto retry;
}
set_yylval_id('.');
SET_LEX_STATE(EXPR_DOT);
diff --git a/test/irb/test_color.rb b/test/irb/test_color.rb
index c25996e976..3ba0c4c1ac 100644
--- a/test/irb/test_color.rb
+++ b/test/irb/test_color.rb
@@ -35,7 +35,7 @@ module TestIRB
'"foo#{a} #{b}"' => "#{RED}\"#{CLEAR}#{RED}foo#{CLEAR}#{RED}\#{#{CLEAR}a#{RED}}#{CLEAR}#{RED} #{CLEAR}#{RED}\#{#{CLEAR}b#{RED}}#{CLEAR}#{RED}\"#{CLEAR}",
'/r#{e}g/' => "#{RED}#{BOLD}/#{CLEAR}#{RED}r#{CLEAR}#{RED}\#{#{CLEAR}e#{RED}}#{CLEAR}#{RED}g#{CLEAR}#{RED}#{BOLD}/#{CLEAR}",
"'a\nb'" => "#{RED}'#{CLEAR}#{RED}a#{CLEAR}\n#{RED}b#{CLEAR}#{RED}'#{CLEAR}",
- "4.5.6" => "#{MAGENTA}#{BOLD}4.5.6#{CLEAR}",
+ "4.5.6" => "4.5.6",
"[1]]]" => "[1]]]",
"\e[0m\n" => "^[[#{BLUE}#{BOLD}0#{CLEAR}m\n",
"%w[a b]" => "#{RED}%w[#{CLEAR}#{RED}a#{CLEAR} #{RED}b#{CLEAR}#{RED}]#{CLEAR}",
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index c59454f8f7..e21f1f9515 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -1086,6 +1086,9 @@ x = __ENCODING__
assert_raise_with_message(SyntaxError, /^ \^~~\z/) do
eval('1.2i1.1')
end
+ assert_raise_with_message(SyntaxError, /^ \^~\z/) do
+ eval('1.2.3')
+ end
end
def test_truncated_source_line