diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-05-26 18:45:59 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2019-05-26 18:47:52 +0900 |
commit | 2ce6365f9ccd93e8129252429391118f794f5e0b (patch) | |
tree | 57e8631b7b739ad5022c0d3c748a6fbb7226dfd7 | |
parent | 58308899151ee3d49f8d9ef5c4e8d108d8822525 (diff) | |
download | ruby-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.y | 20 | ||||
-rw-r--r-- | test/irb/test_color.rb | 2 | ||||
-rw-r--r-- | test/ruby/test_parse.rb | 3 |
3 files changed, 15 insertions, 10 deletions
@@ -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 |