mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Ripper#token
* parse.y (ripper_token): added Ripper#token which returns the current token string. [EXPERIMENTAL]
This commit is contained in:
parent
b3602f1d20
commit
c40003da25
2 changed files with 28 additions and 4 deletions
23
parse.y
23
parse.y
|
@ -12699,6 +12699,28 @@ ripper_state(VALUE self)
|
||||||
return INT2NUM(p->lex.state);
|
return INT2NUM(p->lex.state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* ripper.token -> String
|
||||||
|
*
|
||||||
|
* Return the current token string.
|
||||||
|
*/
|
||||||
|
static VALUE
|
||||||
|
ripper_token(VALUE self)
|
||||||
|
{
|
||||||
|
struct parser_params *p;
|
||||||
|
long pos, len;
|
||||||
|
|
||||||
|
TypedData_Get_Struct(self, struct parser_params, &parser_data_type, p);
|
||||||
|
if (!ripper_initialized_p(p)) {
|
||||||
|
rb_raise(rb_eArgError, "method called for uninitialized object");
|
||||||
|
}
|
||||||
|
if (NIL_P(p->parsing_thread)) return Qnil;
|
||||||
|
pos = p->lex.ptok - p->lex.pbeg;
|
||||||
|
len = p->lex.pcur - p->lex.ptok;
|
||||||
|
return rb_str_subseq(p->lex.lastline, pos, len);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef RIPPER_DEBUG
|
#ifdef RIPPER_DEBUG
|
||||||
/* :nodoc: */
|
/* :nodoc: */
|
||||||
static VALUE
|
static VALUE
|
||||||
|
@ -12762,6 +12784,7 @@ InitVM_ripper(void)
|
||||||
rb_define_method(Ripper, "filename", ripper_filename, 0);
|
rb_define_method(Ripper, "filename", ripper_filename, 0);
|
||||||
rb_define_method(Ripper, "lineno", ripper_lineno, 0);
|
rb_define_method(Ripper, "lineno", ripper_lineno, 0);
|
||||||
rb_define_method(Ripper, "state", ripper_state, 0);
|
rb_define_method(Ripper, "state", ripper_state, 0);
|
||||||
|
rb_define_method(Ripper, "token", ripper_token, 0);
|
||||||
rb_define_method(Ripper, "end_seen?", rb_parser_end_seen_p, 0);
|
rb_define_method(Ripper, "end_seen?", rb_parser_end_seen_p, 0);
|
||||||
rb_define_method(Ripper, "encoding", rb_parser_encoding, 0);
|
rb_define_method(Ripper, "encoding", rb_parser_encoding, 0);
|
||||||
rb_define_method(Ripper, "yydebug", rb_parser_get_yydebug, 0);
|
rb_define_method(Ripper, "yydebug", rb_parser_get_yydebug, 0);
|
||||||
|
|
|
@ -24,8 +24,9 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase
|
||||||
lexer = Ripper::Lexer.new(str)
|
lexer = Ripper::Lexer.new(str)
|
||||||
if error
|
if error
|
||||||
lexer.singleton_class.class_eval do
|
lexer.singleton_class.class_eval do
|
||||||
define_method(:compile_error, error)
|
define_method(:on_parse_error) {|ev|
|
||||||
define_method(:on_parse_error, error)
|
yield __callee__, ev, token()
|
||||||
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
lexer.lex.select {|_1,type,_2| type == sym }.map {|_1,_2,tok| tok }
|
lexer.lex.select {|_1,type,_2| type == sym }.map {|_1,_2,tok| tok }
|
||||||
|
@ -937,8 +938,8 @@ class TestRipper::ScannerEvents < Test::Unit::TestCase
|
||||||
|
|
||||||
assert_equal ["?\\M-H"], scan('CHAR', '?\\M-H')
|
assert_equal ["?\\M-H"], scan('CHAR', '?\\M-H')
|
||||||
err = nil
|
err = nil
|
||||||
assert_equal ["?\\M"], scan('CHAR', '?\\M ') {|e| err = [__callee__, e]}
|
assert_equal ["?\\M"], scan('CHAR', '?\\M ') {|*e| err = e}
|
||||||
assert_equal([:on_parse_error, "Invalid escape character syntax"], err)
|
assert_equal([:on_parse_error, "Invalid escape character syntax", "?\\M "], err)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_label
|
def test_label
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue