summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/ripper/lib/ripper/lexer.rb27
-rw-r--r--parse.y14
2 files changed, 41 insertions, 0 deletions
diff --git a/ext/ripper/lib/ripper/lexer.rb b/ext/ripper/lib/ripper/lexer.rb
index 4e82a1275c..c682c1836f 100644
--- a/ext/ripper/lib/ripper/lexer.rb
+++ b/ext/ripper/lib/ripper/lexer.rb
@@ -47,6 +47,33 @@ class Ripper
class Lexer < ::Ripper #:nodoc: internal use only
Elem = Struct.new(:pos, :event, :tok, :state)
+ class Elem
+ class List < ::Array
+ def inspect
+ [pos, event, tok, Ripper.lex_state_name(state)].inspect
+ end
+
+ def pretty_print(q) # :nodoc:
+ q.group(1, '[', ']') {
+ q.pp pos
+ q.comma_breakable
+ q.pp event
+ q.comma_breakable
+ q.pp tok
+ q.comma_breakable
+ q.text(Ripper.lex_state_name(state))
+ }
+ end
+
+ def pretty_print_cycle(q) # :nodoc:
+ q.text('[...]')
+ end
+ end
+
+ def to_a
+ List[*values]
+ end
+ end
def tokenize
parse().sort_by(&:pos).map(&:tok)
diff --git a/parse.y b/parse.y
index 3b84c2e4e7..4f94b0eb81 100644
--- a/parse.y
+++ b/parse.y
@@ -568,6 +568,7 @@ RUBY_SYMBOL_EXPORT_BEGIN
VALUE rb_parser_reg_compile(struct parser_params* parser, VALUE str, int options);
int rb_reg_fragment_setenc(struct parser_params*, VALUE, int);
enum lex_state_e rb_parser_trace_lex_state(struct parser_params *, enum lex_state_e, enum lex_state_e, int);
+VALUE rb_parser_lex_state_name(enum lex_state_e state);
void rb_parser_show_bitstack(struct parser_params *, stack_type, const char *, int);
PRINTF_ARGS(void rb_parser_fatal(struct parser_params *parser, const char *fmt, ...), 2, 3);
RUBY_SYMBOL_EXPORT_END
@@ -9191,6 +9192,12 @@ rb_parser_trace_lex_state(struct parser_params *parser, enum lex_state_e from,
return to;
}
+VALUE
+rb_parser_lex_state_name(enum lex_state_e state)
+{
+ return append_lex_state_name(state, rb_str_new(0, 0));
+}
+
static void
append_bitstack_value(stack_type stack, VALUE mesg)
{
@@ -11484,6 +11491,11 @@ ripper_value(VALUE self, VALUE obj)
}
#endif
+static VALUE
+ripper_lex_state_name(VALUE self, VALUE state)
+{
+ return rb_parser_lex_state_name(NUM2INT(state));
+}
void
Init_ripper(void)
@@ -11526,6 +11538,8 @@ InitVM_ripper(void)
rb_define_singleton_method(Ripper, "dedent_string", parser_dedent_string, 2);
rb_define_private_method(Ripper, "dedent_string", parser_dedent_string, 2);
+ rb_define_singleton_method(Ripper, "lex_state_name", ripper_lex_state_name, 1);
+
<% @exprs.each do |expr, desc| -%>
/* <%=desc%> */
rb_define_const(Ripper, "<%=expr%>", INT2NUM(<%=expr%>));