aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2019-05-29 12:48:49 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-05-29 13:24:24 +0900
commitcc66272e5061020cac6864bbc2f68f7d327ecfbb (patch)
tree7ef38276f291348c06d1dc7b2a769239cf2435e6
parent8552e9d69693b1d3f99a30d846b9dcc30bf590c2 (diff)
downloadruby-cc66272e5061020cac6864bbc2f68f7d327ecfbb.tar.gz
parse.y: flush invalid char
-rw-r--r--lib/irb/color.rb4
-rw-r--r--parse.y1
-rw-r--r--test/ripper/test_scanner_events.rb11
3 files changed, 14 insertions, 2 deletions
diff --git a/lib/irb/color.rb b/lib/irb/color.rb
index aa4c60aa12..b53cc75035 100644
--- a/lib/irb/color.rb
+++ b/lib/irb/color.rb
@@ -66,9 +66,11 @@ module IRB # :nodoc:
class Lexer < Ripper::Lexer
if method_defined?(:token)
- def on_parse_error(mesg)
+ def on_error(mesg)
@buf.push Elem.new([lineno(), column()], __callee__, token(), state())
end
+ alias on_parse_error on_error
+ alias compile_error on_error
end
end
diff --git a/parse.y b/parse.y
index 091efa9f59..c8930d8792 100644
--- a/parse.y
+++ b/parse.y
@@ -9232,6 +9232,7 @@ parser_yylex(struct parser_params *p)
default:
if (!parser_is_identchar(p)) {
compile_error(p, "Invalid char `\\x%02X' in expression", c);
+ token_flush(p);
goto retry;
}
diff --git a/test/ripper/test_scanner_events.rb b/test/ripper/test_scanner_events.rb
index 727e967d67..0b4814a73e 100644
--- a/test/ripper/test_scanner_events.rb
+++ b/test/ripper/test_scanner_events.rb
@@ -24,9 +24,11 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase
lexer = Ripper::Lexer.new(str)
if error
lexer.singleton_class.class_eval do
- define_method(:on_parse_error) {|ev|
+ define_method(:on_error) {|ev|
yield __callee__, ev, token()
}
+ alias on_parse_error on_error
+ alias compile_error on_error
end
end
lexer.lex.select {|_1,type,_2| type == sym }.map {|_1,_2,tok| tok }
@@ -967,4 +969,11 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase
scan('tlambda_arg', '-> {}')
end
+ def test_invalid_char
+ err = nil
+ assert_equal ['a'], scan('ident', "\ea") {|*e| err = e}
+ assert_equal :compile_error, err[0]
+ assert_match /Invalid char/, err[1]
+ assert_equal "\e", err[2]
+ end
end if ripper_test