diff options
Diffstat (limited to 'ext/ripper')
-rw-r--r-- | ext/ripper/README | 1 | ||||
-rw-r--r-- | ext/ripper/depend | 587 | ||||
-rw-r--r-- | ext/ripper/eventids2.c | 31 | ||||
-rw-r--r-- | ext/ripper/eventids2.h | 8 | ||||
-rw-r--r-- | ext/ripper/extconf.rb | 16 | ||||
-rw-r--r-- | ext/ripper/lib/ripper/lexer.rb | 84 | ||||
-rw-r--r-- | ext/ripper/ripper_init.c.tmpl | 669 | ||||
-rw-r--r-- | ext/ripper/ripper_init.h | 7 | ||||
-rw-r--r-- | ext/ripper/tools/dsl.rb | 42 | ||||
-rw-r--r-- | ext/ripper/tools/generate.rb | 45 | ||||
-rw-r--r-- | ext/ripper/tools/preproc.rb | 94 |
11 files changed, 1454 insertions, 130 deletions
diff --git a/ext/ripper/README b/ext/ripper/README index 2ae2470e13..70fa208920 100644 --- a/ext/ripper/README +++ b/ext/ripper/README @@ -13,7 +13,6 @@ Requirements ------------ * ruby 1.9 (support CVS HEAD only) - * bison 1.28 or later (Other yaccs do not work) Usage ----- diff --git a/ext/ripper/depend b/ext/ripper/depend index 6513ab107f..fe6bd872bd 100644 --- a/ext/ripper/depend +++ b/ext/ripper/depend @@ -1,30 +1,26 @@ GEN = $(srcdir)/tools/generate.rb SRC1 = $(top_srcdir)/parse.y SRC2 = $(srcdir)/eventids2.c +BISON = $(BASERUBY) $(top_srcdir)/tool/lrama/exe/lrama .SUFFIXES: .y -src: ripper.c eventids1.c eventids2table.c +src: ripper.c ripper_init.c eventids1.c eventids1.h eventids2table.c +ripper.c ripper_init.c eventids1.c eventids1.h eventids2table.c: depend ripper.o: ripper.c .y.c: $(ECHO) compiling compiler $< - $(Q) $(BISON) -t -v -oy.tab.c $< - $(Q) sed -e "/^#/s!y\.tab\.c!$@!" -f $(top_srcdir)/tool/ytab.sed y.tab.c > $@ - @$(RM) y.tab.c + $(Q) $(BISON) -t -v -o$@ - $< < $< all: check static: check -ripper.y: $(srcdir)/tools/preproc.rb $(srcdir)/tools/dsl.rb $(top_srcdir)/parse.y {$(VPATH)}id.h +ripper.y: $(srcdir)/tools/preproc.rb $(srcdir)/tools/dsl.rb $(top_srcdir)/parse.y $(top_srcdir)/defs/id.def $(ECHO) extracting $@ from $(top_srcdir)/parse.y - $(Q) $(RUBY) $(top_srcdir)/tool/id2token.rb --path-separator=.$(PATH_SEPARATOR)./ \ - --vpath=$(VPATH)$(PATH_SEPARATOR)$(top_srcdir) id.h $(top_srcdir)/parse.y > ripper.tmp.y - $(Q) $(RUBY) $(top_srcdir)/tool/pure_parser.rb ripper.tmp.y $(BISON) - $(Q) $(RM) ripper.tmp.y.bak - $(Q) $(RUBY) $(srcdir)/tools/preproc.rb ripper.tmp.y --output=$@ - $(Q) $(RM) ripper.tmp.y + $(Q) $(RUBY) $(top_srcdir)/tool/id2token.rb $(top_srcdir)/parse.y | \ + $(RUBY) $(srcdir)/tools/preproc.rb --output=$@ - ripper.y check: .eventids2-check @@ -33,6 +29,10 @@ check: .eventids2-check $(Q) $(RUBY) $(GEN) --mode=check --ids1src=$(SRC1) --ids2src=$(SRC2) @exit > $@ +eventids1.h: $(GEN) $(srcdir)/tools/dsl.rb $(SRC1) + $(ECHO) generating $@ from $(SRC1) + $(Q) $(RUBY) $(GEN) --mode=eventids1_h --ids1src=$(SRC1) --output=$@ + eventids1.c: $(GEN) $(srcdir)/tools/dsl.rb $(SRC1) $(ECHO) generating $@ from $(SRC1) $(Q) $(RUBY) $(GEN) --mode=eventids1 --ids1src=$(SRC1) --output=$@ @@ -41,6 +41,10 @@ eventids2table.c: $(GEN) $(srcdir)/tools/dsl.rb $(SRC2) $(ECHO) generating $@ from $(SRC2) $(Q) $(RUBY) $(GEN) --mode=eventids2table --ids2src=$(SRC2) --output=$@ +ripper_init.c: $(srcdir)/ripper_init.c.tmpl ripper.y $(srcdir)/tools/preproc.rb $(top_srcdir)/internal/ruby_parser.h + $(ECHO) generating $@ from $(srcdir)/ripper_init.c.tmpl + $(Q) $(RUBY) $(srcdir)/tools/preproc.rb --output=$@ --template=$(srcdir)/ripper_init.c.tmpl $(top_srcdir)/internal/ruby_parser.h + # Entries for Ripper maintainer preproc: ripper.E @@ -49,10 +53,349 @@ ripper.E: ripper.c $(Q) $(CC) -E $(INCFLAGS) $(CPPFLAGS) $< | $(RUBY) $(srcdir)/tools/strip.rb > $@ # AUTOGENERATED DEPENDENCIES START +eventids1.o: $(RUBY_EXTCONF_H) +eventids1.o: $(arch_hdrdir)/ruby/config.h +eventids1.o: $(hdrdir)/ruby/assert.h +eventids1.o: $(hdrdir)/ruby/backward.h +eventids1.o: $(hdrdir)/ruby/backward/2/assume.h +eventids1.o: $(hdrdir)/ruby/backward/2/attributes.h +eventids1.o: $(hdrdir)/ruby/backward/2/bool.h +eventids1.o: $(hdrdir)/ruby/backward/2/inttypes.h +eventids1.o: $(hdrdir)/ruby/backward/2/limits.h +eventids1.o: $(hdrdir)/ruby/backward/2/long_long.h +eventids1.o: $(hdrdir)/ruby/backward/2/stdalign.h +eventids1.o: $(hdrdir)/ruby/backward/2/stdarg.h +eventids1.o: $(hdrdir)/ruby/defines.h +eventids1.o: $(hdrdir)/ruby/intern.h +eventids1.o: $(hdrdir)/ruby/internal/abi.h +eventids1.o: $(hdrdir)/ruby/internal/anyargs.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/char.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/double.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/int.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/long.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/short.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +eventids1.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +eventids1.o: $(hdrdir)/ruby/internal/assume.h +eventids1.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +eventids1.o: $(hdrdir)/ruby/internal/attr/artificial.h +eventids1.o: $(hdrdir)/ruby/internal/attr/cold.h +eventids1.o: $(hdrdir)/ruby/internal/attr/const.h +eventids1.o: $(hdrdir)/ruby/internal/attr/constexpr.h +eventids1.o: $(hdrdir)/ruby/internal/attr/deprecated.h +eventids1.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +eventids1.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +eventids1.o: $(hdrdir)/ruby/internal/attr/error.h +eventids1.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +eventids1.o: $(hdrdir)/ruby/internal/attr/forceinline.h +eventids1.o: $(hdrdir)/ruby/internal/attr/format.h +eventids1.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +eventids1.o: $(hdrdir)/ruby/internal/attr/noalias.h +eventids1.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +eventids1.o: $(hdrdir)/ruby/internal/attr/noexcept.h +eventids1.o: $(hdrdir)/ruby/internal/attr/noinline.h +eventids1.o: $(hdrdir)/ruby/internal/attr/nonnull.h +eventids1.o: $(hdrdir)/ruby/internal/attr/noreturn.h +eventids1.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +eventids1.o: $(hdrdir)/ruby/internal/attr/pure.h +eventids1.o: $(hdrdir)/ruby/internal/attr/restrict.h +eventids1.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +eventids1.o: $(hdrdir)/ruby/internal/attr/warning.h +eventids1.o: $(hdrdir)/ruby/internal/attr/weakref.h +eventids1.o: $(hdrdir)/ruby/internal/cast.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +eventids1.o: $(hdrdir)/ruby/internal/compiler_since.h +eventids1.o: $(hdrdir)/ruby/internal/config.h +eventids1.o: $(hdrdir)/ruby/internal/constant_p.h +eventids1.o: $(hdrdir)/ruby/internal/core.h +eventids1.o: $(hdrdir)/ruby/internal/core/rarray.h +eventids1.o: $(hdrdir)/ruby/internal/core/rbasic.h +eventids1.o: $(hdrdir)/ruby/internal/core/rbignum.h +eventids1.o: $(hdrdir)/ruby/internal/core/rclass.h +eventids1.o: $(hdrdir)/ruby/internal/core/rdata.h +eventids1.o: $(hdrdir)/ruby/internal/core/rfile.h +eventids1.o: $(hdrdir)/ruby/internal/core/rhash.h +eventids1.o: $(hdrdir)/ruby/internal/core/robject.h +eventids1.o: $(hdrdir)/ruby/internal/core/rregexp.h +eventids1.o: $(hdrdir)/ruby/internal/core/rstring.h +eventids1.o: $(hdrdir)/ruby/internal/core/rstruct.h +eventids1.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +eventids1.o: $(hdrdir)/ruby/internal/ctype.h +eventids1.o: $(hdrdir)/ruby/internal/dllexport.h +eventids1.o: $(hdrdir)/ruby/internal/dosish.h +eventids1.o: $(hdrdir)/ruby/internal/error.h +eventids1.o: $(hdrdir)/ruby/internal/eval.h +eventids1.o: $(hdrdir)/ruby/internal/event.h +eventids1.o: $(hdrdir)/ruby/internal/fl_type.h +eventids1.o: $(hdrdir)/ruby/internal/gc.h +eventids1.o: $(hdrdir)/ruby/internal/glob.h +eventids1.o: $(hdrdir)/ruby/internal/globals.h +eventids1.o: $(hdrdir)/ruby/internal/has/attribute.h +eventids1.o: $(hdrdir)/ruby/internal/has/builtin.h +eventids1.o: $(hdrdir)/ruby/internal/has/c_attribute.h +eventids1.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +eventids1.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +eventids1.o: $(hdrdir)/ruby/internal/has/extension.h +eventids1.o: $(hdrdir)/ruby/internal/has/feature.h +eventids1.o: $(hdrdir)/ruby/internal/has/warning.h +eventids1.o: $(hdrdir)/ruby/internal/intern/array.h +eventids1.o: $(hdrdir)/ruby/internal/intern/bignum.h +eventids1.o: $(hdrdir)/ruby/internal/intern/class.h +eventids1.o: $(hdrdir)/ruby/internal/intern/compar.h +eventids1.o: $(hdrdir)/ruby/internal/intern/complex.h +eventids1.o: $(hdrdir)/ruby/internal/intern/cont.h +eventids1.o: $(hdrdir)/ruby/internal/intern/dir.h +eventids1.o: $(hdrdir)/ruby/internal/intern/enum.h +eventids1.o: $(hdrdir)/ruby/internal/intern/enumerator.h +eventids1.o: $(hdrdir)/ruby/internal/intern/error.h +eventids1.o: $(hdrdir)/ruby/internal/intern/eval.h +eventids1.o: $(hdrdir)/ruby/internal/intern/file.h +eventids1.o: $(hdrdir)/ruby/internal/intern/hash.h +eventids1.o: $(hdrdir)/ruby/internal/intern/io.h +eventids1.o: $(hdrdir)/ruby/internal/intern/load.h +eventids1.o: $(hdrdir)/ruby/internal/intern/marshal.h +eventids1.o: $(hdrdir)/ruby/internal/intern/numeric.h +eventids1.o: $(hdrdir)/ruby/internal/intern/object.h +eventids1.o: $(hdrdir)/ruby/internal/intern/parse.h +eventids1.o: $(hdrdir)/ruby/internal/intern/proc.h +eventids1.o: $(hdrdir)/ruby/internal/intern/process.h +eventids1.o: $(hdrdir)/ruby/internal/intern/random.h +eventids1.o: $(hdrdir)/ruby/internal/intern/range.h +eventids1.o: $(hdrdir)/ruby/internal/intern/rational.h +eventids1.o: $(hdrdir)/ruby/internal/intern/re.h +eventids1.o: $(hdrdir)/ruby/internal/intern/ruby.h +eventids1.o: $(hdrdir)/ruby/internal/intern/select.h +eventids1.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +eventids1.o: $(hdrdir)/ruby/internal/intern/signal.h +eventids1.o: $(hdrdir)/ruby/internal/intern/sprintf.h +eventids1.o: $(hdrdir)/ruby/internal/intern/string.h +eventids1.o: $(hdrdir)/ruby/internal/intern/struct.h +eventids1.o: $(hdrdir)/ruby/internal/intern/thread.h +eventids1.o: $(hdrdir)/ruby/internal/intern/time.h +eventids1.o: $(hdrdir)/ruby/internal/intern/variable.h +eventids1.o: $(hdrdir)/ruby/internal/intern/vm.h +eventids1.o: $(hdrdir)/ruby/internal/interpreter.h +eventids1.o: $(hdrdir)/ruby/internal/iterator.h +eventids1.o: $(hdrdir)/ruby/internal/memory.h +eventids1.o: $(hdrdir)/ruby/internal/method.h +eventids1.o: $(hdrdir)/ruby/internal/module.h +eventids1.o: $(hdrdir)/ruby/internal/newobj.h +eventids1.o: $(hdrdir)/ruby/internal/scan_args.h +eventids1.o: $(hdrdir)/ruby/internal/special_consts.h +eventids1.o: $(hdrdir)/ruby/internal/static_assert.h +eventids1.o: $(hdrdir)/ruby/internal/stdalign.h +eventids1.o: $(hdrdir)/ruby/internal/stdbool.h +eventids1.o: $(hdrdir)/ruby/internal/stdckdint.h +eventids1.o: $(hdrdir)/ruby/internal/symbol.h +eventids1.o: $(hdrdir)/ruby/internal/value.h +eventids1.o: $(hdrdir)/ruby/internal/value_type.h +eventids1.o: $(hdrdir)/ruby/internal/variable.h +eventids1.o: $(hdrdir)/ruby/internal/warning_push.h +eventids1.o: $(hdrdir)/ruby/internal/xmalloc.h +eventids1.o: $(hdrdir)/ruby/missing.h +eventids1.o: $(hdrdir)/ruby/ruby.h +eventids1.o: $(hdrdir)/ruby/st.h +eventids1.o: $(hdrdir)/ruby/subst.h +eventids1.o: eventids1.h +eventids1.o: {$(VPATH)}eventids1.c +eventids1.o: {$(VPATH)}eventids1.h +eventids2.o: $(RUBY_EXTCONF_H) +eventids2.o: $(arch_hdrdir)/ruby/config.h +eventids2.o: $(hdrdir)/ruby/assert.h +eventids2.o: $(hdrdir)/ruby/backward.h +eventids2.o: $(hdrdir)/ruby/backward/2/assume.h +eventids2.o: $(hdrdir)/ruby/backward/2/attributes.h +eventids2.o: $(hdrdir)/ruby/backward/2/bool.h +eventids2.o: $(hdrdir)/ruby/backward/2/inttypes.h +eventids2.o: $(hdrdir)/ruby/backward/2/limits.h +eventids2.o: $(hdrdir)/ruby/backward/2/long_long.h +eventids2.o: $(hdrdir)/ruby/backward/2/stdalign.h +eventids2.o: $(hdrdir)/ruby/backward/2/stdarg.h +eventids2.o: $(hdrdir)/ruby/defines.h +eventids2.o: $(hdrdir)/ruby/encoding.h +eventids2.o: $(hdrdir)/ruby/intern.h +eventids2.o: $(hdrdir)/ruby/internal/abi.h +eventids2.o: $(hdrdir)/ruby/internal/anyargs.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/char.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/double.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/int.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/long.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/short.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +eventids2.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +eventids2.o: $(hdrdir)/ruby/internal/assume.h +eventids2.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +eventids2.o: $(hdrdir)/ruby/internal/attr/artificial.h +eventids2.o: $(hdrdir)/ruby/internal/attr/cold.h +eventids2.o: $(hdrdir)/ruby/internal/attr/const.h +eventids2.o: $(hdrdir)/ruby/internal/attr/constexpr.h +eventids2.o: $(hdrdir)/ruby/internal/attr/deprecated.h +eventids2.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +eventids2.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +eventids2.o: $(hdrdir)/ruby/internal/attr/error.h +eventids2.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +eventids2.o: $(hdrdir)/ruby/internal/attr/forceinline.h +eventids2.o: $(hdrdir)/ruby/internal/attr/format.h +eventids2.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +eventids2.o: $(hdrdir)/ruby/internal/attr/noalias.h +eventids2.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +eventids2.o: $(hdrdir)/ruby/internal/attr/noexcept.h +eventids2.o: $(hdrdir)/ruby/internal/attr/noinline.h +eventids2.o: $(hdrdir)/ruby/internal/attr/nonnull.h +eventids2.o: $(hdrdir)/ruby/internal/attr/noreturn.h +eventids2.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +eventids2.o: $(hdrdir)/ruby/internal/attr/pure.h +eventids2.o: $(hdrdir)/ruby/internal/attr/restrict.h +eventids2.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +eventids2.o: $(hdrdir)/ruby/internal/attr/warning.h +eventids2.o: $(hdrdir)/ruby/internal/attr/weakref.h +eventids2.o: $(hdrdir)/ruby/internal/cast.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +eventids2.o: $(hdrdir)/ruby/internal/compiler_since.h +eventids2.o: $(hdrdir)/ruby/internal/config.h +eventids2.o: $(hdrdir)/ruby/internal/constant_p.h +eventids2.o: $(hdrdir)/ruby/internal/core.h +eventids2.o: $(hdrdir)/ruby/internal/core/rarray.h +eventids2.o: $(hdrdir)/ruby/internal/core/rbasic.h +eventids2.o: $(hdrdir)/ruby/internal/core/rbignum.h +eventids2.o: $(hdrdir)/ruby/internal/core/rclass.h +eventids2.o: $(hdrdir)/ruby/internal/core/rdata.h +eventids2.o: $(hdrdir)/ruby/internal/core/rfile.h +eventids2.o: $(hdrdir)/ruby/internal/core/rhash.h +eventids2.o: $(hdrdir)/ruby/internal/core/robject.h +eventids2.o: $(hdrdir)/ruby/internal/core/rregexp.h +eventids2.o: $(hdrdir)/ruby/internal/core/rstring.h +eventids2.o: $(hdrdir)/ruby/internal/core/rstruct.h +eventids2.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +eventids2.o: $(hdrdir)/ruby/internal/ctype.h +eventids2.o: $(hdrdir)/ruby/internal/dllexport.h +eventids2.o: $(hdrdir)/ruby/internal/dosish.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/coderange.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/ctype.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/encoding.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/pathname.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/re.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/sprintf.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/string.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/symbol.h +eventids2.o: $(hdrdir)/ruby/internal/encoding/transcode.h +eventids2.o: $(hdrdir)/ruby/internal/error.h +eventids2.o: $(hdrdir)/ruby/internal/eval.h +eventids2.o: $(hdrdir)/ruby/internal/event.h +eventids2.o: $(hdrdir)/ruby/internal/fl_type.h +eventids2.o: $(hdrdir)/ruby/internal/gc.h +eventids2.o: $(hdrdir)/ruby/internal/glob.h +eventids2.o: $(hdrdir)/ruby/internal/globals.h +eventids2.o: $(hdrdir)/ruby/internal/has/attribute.h +eventids2.o: $(hdrdir)/ruby/internal/has/builtin.h +eventids2.o: $(hdrdir)/ruby/internal/has/c_attribute.h +eventids2.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +eventids2.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +eventids2.o: $(hdrdir)/ruby/internal/has/extension.h +eventids2.o: $(hdrdir)/ruby/internal/has/feature.h +eventids2.o: $(hdrdir)/ruby/internal/has/warning.h +eventids2.o: $(hdrdir)/ruby/internal/intern/array.h +eventids2.o: $(hdrdir)/ruby/internal/intern/bignum.h +eventids2.o: $(hdrdir)/ruby/internal/intern/class.h +eventids2.o: $(hdrdir)/ruby/internal/intern/compar.h +eventids2.o: $(hdrdir)/ruby/internal/intern/complex.h +eventids2.o: $(hdrdir)/ruby/internal/intern/cont.h +eventids2.o: $(hdrdir)/ruby/internal/intern/dir.h +eventids2.o: $(hdrdir)/ruby/internal/intern/enum.h +eventids2.o: $(hdrdir)/ruby/internal/intern/enumerator.h +eventids2.o: $(hdrdir)/ruby/internal/intern/error.h +eventids2.o: $(hdrdir)/ruby/internal/intern/eval.h +eventids2.o: $(hdrdir)/ruby/internal/intern/file.h +eventids2.o: $(hdrdir)/ruby/internal/intern/hash.h +eventids2.o: $(hdrdir)/ruby/internal/intern/io.h +eventids2.o: $(hdrdir)/ruby/internal/intern/load.h +eventids2.o: $(hdrdir)/ruby/internal/intern/marshal.h +eventids2.o: $(hdrdir)/ruby/internal/intern/numeric.h +eventids2.o: $(hdrdir)/ruby/internal/intern/object.h +eventids2.o: $(hdrdir)/ruby/internal/intern/parse.h +eventids2.o: $(hdrdir)/ruby/internal/intern/proc.h +eventids2.o: $(hdrdir)/ruby/internal/intern/process.h +eventids2.o: $(hdrdir)/ruby/internal/intern/random.h +eventids2.o: $(hdrdir)/ruby/internal/intern/range.h +eventids2.o: $(hdrdir)/ruby/internal/intern/rational.h +eventids2.o: $(hdrdir)/ruby/internal/intern/re.h +eventids2.o: $(hdrdir)/ruby/internal/intern/ruby.h +eventids2.o: $(hdrdir)/ruby/internal/intern/select.h +eventids2.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +eventids2.o: $(hdrdir)/ruby/internal/intern/signal.h +eventids2.o: $(hdrdir)/ruby/internal/intern/sprintf.h +eventids2.o: $(hdrdir)/ruby/internal/intern/string.h +eventids2.o: $(hdrdir)/ruby/internal/intern/struct.h +eventids2.o: $(hdrdir)/ruby/internal/intern/thread.h +eventids2.o: $(hdrdir)/ruby/internal/intern/time.h +eventids2.o: $(hdrdir)/ruby/internal/intern/variable.h +eventids2.o: $(hdrdir)/ruby/internal/intern/vm.h +eventids2.o: $(hdrdir)/ruby/internal/interpreter.h +eventids2.o: $(hdrdir)/ruby/internal/iterator.h +eventids2.o: $(hdrdir)/ruby/internal/memory.h +eventids2.o: $(hdrdir)/ruby/internal/method.h +eventids2.o: $(hdrdir)/ruby/internal/module.h +eventids2.o: $(hdrdir)/ruby/internal/newobj.h +eventids2.o: $(hdrdir)/ruby/internal/scan_args.h +eventids2.o: $(hdrdir)/ruby/internal/special_consts.h +eventids2.o: $(hdrdir)/ruby/internal/static_assert.h +eventids2.o: $(hdrdir)/ruby/internal/stdalign.h +eventids2.o: $(hdrdir)/ruby/internal/stdbool.h +eventids2.o: $(hdrdir)/ruby/internal/stdckdint.h +eventids2.o: $(hdrdir)/ruby/internal/symbol.h +eventids2.o: $(hdrdir)/ruby/internal/value.h +eventids2.o: $(hdrdir)/ruby/internal/value_type.h +eventids2.o: $(hdrdir)/ruby/internal/variable.h +eventids2.o: $(hdrdir)/ruby/internal/warning_push.h +eventids2.o: $(hdrdir)/ruby/internal/xmalloc.h +eventids2.o: $(hdrdir)/ruby/missing.h +eventids2.o: $(hdrdir)/ruby/onigmo.h +eventids2.o: $(hdrdir)/ruby/oniguruma.h +eventids2.o: $(hdrdir)/ruby/ruby.h +eventids2.o: $(hdrdir)/ruby/st.h +eventids2.o: $(hdrdir)/ruby/subst.h +eventids2.o: $(top_srcdir)/internal.h +eventids2.o: $(top_srcdir)/internal/static_assert.h +eventids2.o: $(top_srcdir)/rubyparser.h +eventids2.o: eventids2.c +eventids2.o: eventids2.h +eventids2.o: {$(VPATH)}eventids2table.c +eventids2.o: {$(VPATH)}parse.h ripper.o: $(RUBY_EXTCONF_H) ripper.o: $(arch_hdrdir)/ruby/config.h ripper.o: $(hdrdir)/ruby.h ripper.o: $(hdrdir)/ruby/assert.h +ripper.o: $(hdrdir)/ruby/atomic.h ripper.o: $(hdrdir)/ruby/backward.h ripper.o: $(hdrdir)/ruby/backward/2/assume.h ripper.o: $(hdrdir)/ruby/backward/2/attributes.h @@ -66,6 +409,7 @@ ripper.o: $(hdrdir)/ruby/backward/2/stdarg.h ripper.o: $(hdrdir)/ruby/defines.h ripper.o: $(hdrdir)/ruby/encoding.h ripper.o: $(hdrdir)/ruby/intern.h +ripper.o: $(hdrdir)/ruby/internal/abi.h ripper.o: $(hdrdir)/ruby/internal/anyargs.h ripper.o: $(hdrdir)/ruby/internal/arithmetic.h ripper.o: $(hdrdir)/ruby/internal/arithmetic/char.h @@ -103,6 +447,7 @@ ripper.o: $(hdrdir)/ruby/internal/attr/noexcept.h ripper.o: $(hdrdir)/ruby/internal/attr/noinline.h ripper.o: $(hdrdir)/ruby/internal/attr/nonnull.h ripper.o: $(hdrdir)/ruby/internal/attr/noreturn.h +ripper.o: $(hdrdir)/ruby/internal/attr/packed_struct.h ripper.o: $(hdrdir)/ruby/internal/attr/pure.h ripper.o: $(hdrdir)/ruby/internal/attr/restrict.h ripper.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h @@ -171,7 +516,6 @@ ripper.o: $(hdrdir)/ruby/internal/intern/enumerator.h ripper.o: $(hdrdir)/ruby/internal/intern/error.h ripper.o: $(hdrdir)/ruby/internal/intern/eval.h ripper.o: $(hdrdir)/ruby/internal/intern/file.h -ripper.o: $(hdrdir)/ruby/internal/intern/gc.h ripper.o: $(hdrdir)/ruby/internal/intern/hash.h ripper.o: $(hdrdir)/ruby/internal/intern/io.h ripper.o: $(hdrdir)/ruby/internal/intern/load.h @@ -202,12 +546,12 @@ ripper.o: $(hdrdir)/ruby/internal/memory.h ripper.o: $(hdrdir)/ruby/internal/method.h ripper.o: $(hdrdir)/ruby/internal/module.h ripper.o: $(hdrdir)/ruby/internal/newobj.h -ripper.o: $(hdrdir)/ruby/internal/rgengc.h ripper.o: $(hdrdir)/ruby/internal/scan_args.h ripper.o: $(hdrdir)/ruby/internal/special_consts.h ripper.o: $(hdrdir)/ruby/internal/static_assert.h ripper.o: $(hdrdir)/ruby/internal/stdalign.h ripper.o: $(hdrdir)/ruby/internal/stdbool.h +ripper.o: $(hdrdir)/ruby/internal/stdckdint.h ripper.o: $(hdrdir)/ruby/internal/symbol.h ripper.o: $(hdrdir)/ruby/internal/value.h ripper.o: $(hdrdir)/ruby/internal/value_type.h @@ -223,16 +567,24 @@ ripper.o: $(hdrdir)/ruby/regex.h ripper.o: $(hdrdir)/ruby/ruby.h ripper.o: $(hdrdir)/ruby/st.h ripper.o: $(hdrdir)/ruby/subst.h +ripper.o: $(hdrdir)/ruby/thread_native.h ripper.o: $(hdrdir)/ruby/util.h +ripper.o: $(hdrdir)/ruby/version.h +ripper.o: $(top_srcdir)/ccan/check_type/check_type.h +ripper.o: $(top_srcdir)/ccan/container_of/container_of.h +ripper.o: $(top_srcdir)/ccan/list/list.h +ripper.o: $(top_srcdir)/ccan/str/str.h ripper.o: $(top_srcdir)/constant.h ripper.o: $(top_srcdir)/id_table.h ripper.o: $(top_srcdir)/internal.h ripper.o: $(top_srcdir)/internal/array.h +ripper.o: $(top_srcdir)/internal/basic_operators.h ripper.o: $(top_srcdir)/internal/bignum.h ripper.o: $(top_srcdir)/internal/bits.h ripper.o: $(top_srcdir)/internal/compile.h ripper.o: $(top_srcdir)/internal/compilers.h ripper.o: $(top_srcdir)/internal/complex.h +ripper.o: $(top_srcdir)/internal/encoding.h ripper.o: $(top_srcdir)/internal/error.h ripper.o: $(top_srcdir)/internal/fixnum.h ripper.o: $(top_srcdir)/internal/gc.h @@ -243,22 +595,35 @@ ripper.o: $(top_srcdir)/internal/numeric.h ripper.o: $(top_srcdir)/internal/parse.h ripper.o: $(top_srcdir)/internal/rational.h ripper.o: $(top_srcdir)/internal/re.h +ripper.o: $(top_srcdir)/internal/ruby_parser.h +ripper.o: $(top_srcdir)/internal/sanitizers.h ripper.o: $(top_srcdir)/internal/serial.h ripper.o: $(top_srcdir)/internal/static_assert.h ripper.o: $(top_srcdir)/internal/string.h ripper.o: $(top_srcdir)/internal/symbol.h ripper.o: $(top_srcdir)/internal/thread.h -ripper.o: $(top_srcdir)/internal/util.h ripper.o: $(top_srcdir)/internal/variable.h ripper.o: $(top_srcdir)/internal/vm.h ripper.o: $(top_srcdir)/internal/warnings.h +ripper.o: $(top_srcdir)/method.h ripper.o: $(top_srcdir)/node.h +ripper.o: $(top_srcdir)/parser_node.h +ripper.o: $(top_srcdir)/parser_st.h ripper.o: $(top_srcdir)/regenc.h ripper.o: $(top_srcdir)/ruby_assert.h +ripper.o: $(top_srcdir)/ruby_atomic.h +ripper.o: $(top_srcdir)/rubyparser.h +ripper.o: $(top_srcdir)/shape.h ripper.o: $(top_srcdir)/symbol.h +ripper.o: $(top_srcdir)/thread_pthread.h +ripper.o: $(top_srcdir)/vm_core.h +ripper.o: $(top_srcdir)/vm_opts.h ripper.o: ../../probes.h +ripper.o: eventids1.h ripper.o: eventids2.c +ripper.o: eventids2.h ripper.o: ripper.y +ripper.o: ripper_init.h ripper.o: {$(VPATH)}eventids1.c ripper.o: {$(VPATH)}eventids2table.c ripper.o: {$(VPATH)}id.h @@ -266,4 +631,198 @@ ripper.o: {$(VPATH)}lex.c ripper.o: {$(VPATH)}parse.h ripper.o: {$(VPATH)}probes.dmyh ripper.o: {$(VPATH)}ripper.c +ripper_init.o: $(RUBY_EXTCONF_H) +ripper_init.o: $(arch_hdrdir)/ruby/config.h +ripper_init.o: $(hdrdir)/ruby/assert.h +ripper_init.o: $(hdrdir)/ruby/backward.h +ripper_init.o: $(hdrdir)/ruby/backward/2/assume.h +ripper_init.o: $(hdrdir)/ruby/backward/2/attributes.h +ripper_init.o: $(hdrdir)/ruby/backward/2/bool.h +ripper_init.o: $(hdrdir)/ruby/backward/2/gcc_version_since.h +ripper_init.o: $(hdrdir)/ruby/backward/2/inttypes.h +ripper_init.o: $(hdrdir)/ruby/backward/2/limits.h +ripper_init.o: $(hdrdir)/ruby/backward/2/long_long.h +ripper_init.o: $(hdrdir)/ruby/backward/2/stdalign.h +ripper_init.o: $(hdrdir)/ruby/backward/2/stdarg.h +ripper_init.o: $(hdrdir)/ruby/defines.h +ripper_init.o: $(hdrdir)/ruby/encoding.h +ripper_init.o: $(hdrdir)/ruby/intern.h +ripper_init.o: $(hdrdir)/ruby/internal/abi.h +ripper_init.o: $(hdrdir)/ruby/internal/anyargs.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/char.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/double.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/fixnum.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/gid_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/int.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/intptr_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/long.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/long_long.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/mode_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/off_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/pid_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/short.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/size_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/st_data_t.h +ripper_init.o: $(hdrdir)/ruby/internal/arithmetic/uid_t.h +ripper_init.o: $(hdrdir)/ruby/internal/assume.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/alloc_size.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/artificial.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/cold.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/const.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/constexpr.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/deprecated.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/diagnose_if.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/enum_extensibility.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/error.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/flag_enum.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/forceinline.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/format.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/maybe_unused.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/noalias.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/nodiscard.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/noexcept.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/noinline.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/nonnull.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/noreturn.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/packed_struct.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/pure.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/restrict.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/returns_nonnull.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/warning.h +ripper_init.o: $(hdrdir)/ruby/internal/attr/weakref.h +ripper_init.o: $(hdrdir)/ruby/internal/cast.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is/apple.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is/clang.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is/gcc.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is/intel.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is/msvc.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_is/sunpro.h +ripper_init.o: $(hdrdir)/ruby/internal/compiler_since.h +ripper_init.o: $(hdrdir)/ruby/internal/config.h +ripper_init.o: $(hdrdir)/ruby/internal/constant_p.h +ripper_init.o: $(hdrdir)/ruby/internal/core.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rarray.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rbasic.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rbignum.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rclass.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rdata.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rfile.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rhash.h +ripper_init.o: $(hdrdir)/ruby/internal/core/robject.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rregexp.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rstring.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rstruct.h +ripper_init.o: $(hdrdir)/ruby/internal/core/rtypeddata.h +ripper_init.o: $(hdrdir)/ruby/internal/ctype.h +ripper_init.o: $(hdrdir)/ruby/internal/dllexport.h +ripper_init.o: $(hdrdir)/ruby/internal/dosish.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/coderange.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/ctype.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/encoding.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/pathname.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/re.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/sprintf.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/string.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/symbol.h +ripper_init.o: $(hdrdir)/ruby/internal/encoding/transcode.h +ripper_init.o: $(hdrdir)/ruby/internal/error.h +ripper_init.o: $(hdrdir)/ruby/internal/eval.h +ripper_init.o: $(hdrdir)/ruby/internal/event.h +ripper_init.o: $(hdrdir)/ruby/internal/fl_type.h +ripper_init.o: $(hdrdir)/ruby/internal/gc.h +ripper_init.o: $(hdrdir)/ruby/internal/glob.h +ripper_init.o: $(hdrdir)/ruby/internal/globals.h +ripper_init.o: $(hdrdir)/ruby/internal/has/attribute.h +ripper_init.o: $(hdrdir)/ruby/internal/has/builtin.h +ripper_init.o: $(hdrdir)/ruby/internal/has/c_attribute.h +ripper_init.o: $(hdrdir)/ruby/internal/has/cpp_attribute.h +ripper_init.o: $(hdrdir)/ruby/internal/has/declspec_attribute.h +ripper_init.o: $(hdrdir)/ruby/internal/has/extension.h +ripper_init.o: $(hdrdir)/ruby/internal/has/feature.h +ripper_init.o: $(hdrdir)/ruby/internal/has/warning.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/array.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/bignum.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/class.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/compar.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/complex.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/cont.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/dir.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/enum.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/enumerator.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/error.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/eval.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/file.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/hash.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/io.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/load.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/marshal.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/numeric.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/object.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/parse.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/proc.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/process.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/random.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/range.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/rational.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/re.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/ruby.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/select.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/select/largesize.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/signal.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/sprintf.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/string.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/struct.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/thread.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/time.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/variable.h +ripper_init.o: $(hdrdir)/ruby/internal/intern/vm.h +ripper_init.o: $(hdrdir)/ruby/internal/interpreter.h +ripper_init.o: $(hdrdir)/ruby/internal/iterator.h +ripper_init.o: $(hdrdir)/ruby/internal/memory.h +ripper_init.o: $(hdrdir)/ruby/internal/method.h +ripper_init.o: $(hdrdir)/ruby/internal/module.h +ripper_init.o: $(hdrdir)/ruby/internal/newobj.h +ripper_init.o: $(hdrdir)/ruby/internal/scan_args.h +ripper_init.o: $(hdrdir)/ruby/internal/special_consts.h +ripper_init.o: $(hdrdir)/ruby/internal/static_assert.h +ripper_init.o: $(hdrdir)/ruby/internal/stdalign.h +ripper_init.o: $(hdrdir)/ruby/internal/stdbool.h +ripper_init.o: $(hdrdir)/ruby/internal/stdckdint.h +ripper_init.o: $(hdrdir)/ruby/internal/symbol.h +ripper_init.o: $(hdrdir)/ruby/internal/value.h +ripper_init.o: $(hdrdir)/ruby/internal/value_type.h +ripper_init.o: $(hdrdir)/ruby/internal/variable.h +ripper_init.o: $(hdrdir)/ruby/internal/warning_push.h +ripper_init.o: $(hdrdir)/ruby/internal/xmalloc.h +ripper_init.o: $(hdrdir)/ruby/missing.h +ripper_init.o: $(hdrdir)/ruby/onigmo.h +ripper_init.o: $(hdrdir)/ruby/oniguruma.h +ripper_init.o: $(hdrdir)/ruby/ruby.h +ripper_init.o: $(hdrdir)/ruby/st.h +ripper_init.o: $(hdrdir)/ruby/subst.h +ripper_init.o: $(top_srcdir)/internal.h +ripper_init.o: $(top_srcdir)/internal/array.h +ripper_init.o: $(top_srcdir)/internal/bignum.h +ripper_init.o: $(top_srcdir)/internal/bits.h +ripper_init.o: $(top_srcdir)/internal/compilers.h +ripper_init.o: $(top_srcdir)/internal/complex.h +ripper_init.o: $(top_srcdir)/internal/fixnum.h +ripper_init.o: $(top_srcdir)/internal/imemo.h +ripper_init.o: $(top_srcdir)/internal/numeric.h +ripper_init.o: $(top_srcdir)/internal/parse.h +ripper_init.o: $(top_srcdir)/internal/rational.h +ripper_init.o: $(top_srcdir)/internal/ruby_parser.h +ripper_init.o: $(top_srcdir)/internal/serial.h +ripper_init.o: $(top_srcdir)/internal/static_assert.h +ripper_init.o: $(top_srcdir)/internal/vm.h +ripper_init.o: $(top_srcdir)/node.h +ripper_init.o: $(top_srcdir)/ruby_assert.h +ripper_init.o: $(top_srcdir)/rubyparser.h +ripper_init.o: eventids1.h +ripper_init.o: eventids2.h +ripper_init.o: ripper_init.h +ripper_init.o: {$(VPATH)}parse.h +ripper_init.o: {$(VPATH)}ripper_init.c # AUTOGENERATED DEPENDENCIES END diff --git a/ext/ripper/eventids2.c b/ext/ripper/eventids2.c index ac38663f2d..439663f0fd 100644 --- a/ext/ripper/eventids2.c +++ b/ext/ripper/eventids2.c @@ -1,21 +1,10 @@ -enum { - tIGNORED_NL = tLAST_TOKEN + 1, -# define tIGNORED_NL ((enum yytokentype)tIGNORED_NL) - tCOMMENT, -# define tCOMMENT ((enum yytokentype)tCOMMENT) - tEMBDOC_BEG, -# define tEMBDOC_BEG ((enum yytokentype)tEMBDOC_BEG) - tEMBDOC, -# define tEMBDOC ((enum yytokentype)tEMBDOC) - tEMBDOC_END, -# define tEMBDOC_END ((enum yytokentype)tEMBDOC_END) - tHEREDOC_BEG, -# define tHEREDOC_BEG ((enum yytokentype)tHEREDOC_BEG) - tHEREDOC_END, -# define tHEREDOC_END ((enum yytokentype)tHEREDOC_END) - k__END__, -# define k__END__ ((enum yytokentype)k__END__) -}; +#include "ruby/ruby.h" +#include "rubyparser.h" +#define YYSTYPE_IS_DECLARED +#include "parse.h" +#include "eventids2.h" +#include "internal.h" +#include "internal/static_assert.h" typedef struct { ID ripper_id_backref; @@ -76,7 +65,9 @@ static ripper_scanner_ids_t ripper_scanner_ids; #include "eventids2table.c" -static void +STATIC_ASSERT(eventids2_table_size, RIPPER_EVENTIDS2_TABLE_SIZE == sizeof(ripper_scanner_ids)/sizeof(ID)); + +void ripper_init_eventids2(void) { #define set_id2(name) ripper_scanner_ids.ripper_id_##name = rb_intern_const("on_"#name) @@ -137,7 +128,7 @@ ripper_init_eventids2(void) STATIC_ASSERT(k__END___range, k__END__ < SHRT_MAX); STATIC_ASSERT(ripper_scanner_ids_size, sizeof(ripper_scanner_ids) < SHRT_MAX); -static ID +ID ripper_token2eventid(enum yytokentype tok) { #define O(member) (int)offsetof(ripper_scanner_ids_t, ripper_id_##member)+1 diff --git a/ext/ripper/eventids2.h b/ext/ripper/eventids2.h new file mode 100644 index 0000000000..49e46432b9 --- /dev/null +++ b/ext/ripper/eventids2.h @@ -0,0 +1,8 @@ +#ifndef RIPPER_EVENTIDS2 +#define RIPPER_EVENTIDS2 + +void ripper_init_eventids2(void); +void ripper_init_eventids2_table(VALUE self); +ID ripper_token2eventid(enum yytokentype tok); + +#endif /* RIPPER_EVENTIDS2 */ diff --git a/ext/ripper/extconf.rb b/ext/ripper/extconf.rb index 2dde565bd9..c3c56c27c5 100644 --- a/ext/ripper/extconf.rb +++ b/ext/ripper/extconf.rb @@ -5,22 +5,14 @@ require 'mkmf' require 'rbconfig' def main - yacc = ENV["YACC"] || "bison" - - unless find_executable(yacc) - unless File.exist?('ripper.c') or File.exist?("#{$srcdir}/ripper.c") - raise 'missing bison; abort' - end - end - $objs = %w(ripper.o) - $cleanfiles.concat %w(ripper.y ripper.c ripper.E ripper.output y.output eventids1.c eventids2table.c .eventids2-check) + $objs = %w(eventids1.o eventids2.o ripper.o ripper_init.o) + $distcleanfiles.concat %w(ripper.y ripper.c eventids1.c eventids1.h eventids2table.c ripper_init.c) + $cleanfiles.concat %w(ripper.E ripper.output y.output .eventids2-check) $defs << '-DRIPPER' $defs << '-DRIPPER_DEBUG' if $debug $VPATH << '$(topdir)' << '$(top_srcdir)' $INCFLAGS << ' -I$(topdir) -I$(top_srcdir)' - create_makefile 'ripper' do |conf| - conf << "BISON = #{yacc}" - end + create_makefile 'ripper' end main diff --git a/ext/ripper/lib/ripper/lexer.rb b/ext/ripper/lib/ripper/lexer.rb index f6051c6341..6a3c04af30 100644 --- a/ext/ripper/lib/ripper/lexer.rb +++ b/ext/ripper/lib/ripper/lexer.rb @@ -53,10 +53,27 @@ class Ripper end class Lexer < ::Ripper #:nodoc: internal use only - State = Struct.new(:to_int, :to_s) do + class State + attr_reader :to_int, :to_s + + def initialize(i) + @to_int = i + @to_s = Ripper.lex_state_name(i) + freeze + end + + def [](index) + case index + when 0, :to_int + @to_int + when 1, :to_s + @event + else + nil + end + end + alias to_i to_int - def initialize(i) super(i, Ripper.lex_state_name(i)).freeze end - # def inspect; "#<#{self.class}: #{self}>" end alias inspect to_s def pretty_print(q) q.text(to_s) end def ==(i) super or to_int == i end @@ -67,15 +84,40 @@ class Ripper def nobits?(i) to_int.nobits?(i) end end - Elem = Struct.new(:pos, :event, :tok, :state, :message) do + class Elem + attr_accessor :pos, :event, :tok, :state, :message + def initialize(pos, event, tok, state, message = nil) - super(pos, event, tok, State.new(state), message) + @pos = pos + @event = event + @tok = tok + @state = State.new(state) + @message = message + end + + def [](index) + case index + when 0, :pos + @pos + when 1, :event + @event + when 2, :tok + @tok + when 3, :state + @state + when 4, :message + @message + else + nil + end end def inspect "#<#{self.class}: #{event}@#{pos[0]}:#{pos[1]}:#{state}: #{tok.inspect}#{": " if message}#{message}>" end + alias to_s inspect + def pretty_print(q) q.group(2, "#<#{self.class}:", ">") { q.breakable @@ -94,9 +136,11 @@ class Ripper end def to_a - a = super - a.pop unless a.last - a + if @message + [@pos, @event, @tok, @state, @message] + else + [@pos, @event, @tok, @state] + end end end @@ -152,17 +196,19 @@ class Ripper def on_heredoc_dedent(v, w) ignored_sp = [] heredoc = @buf.last - heredoc.each_with_index do |e, i| - if Elem === e and e.event == :on_tstring_content and e.pos[1].zero? - tok = e.tok.dup if w > 0 and /\A\s/ =~ e.tok - if (n = dedent_string(e.tok, w)) > 0 - if e.tok.empty? - e.tok = tok[0, n] - e.event = :on_ignored_sp - next + if Array === heredoc + heredoc.each_with_index do |e, i| + if Elem === e and e.event == :on_tstring_content and e.pos[1].zero? + tok = e.tok.dup if w > 0 and /\A\s/ =~ e.tok + if (n = dedent_string(e.tok, w)) > 0 + if e.tok.empty? + e.tok = tok[0, n] + e.event = :on_ignored_sp + next + end + ignored_sp << [i, Elem.new(e.pos.dup, :on_ignored_sp, tok[0, n], e.state)] + e.pos[1] += n end - ignored_sp << [i, Elem.new(e.pos.dup, :on_ignored_sp, tok[0, n], e.state)] - e.pos[1] += n end end end @@ -182,7 +228,7 @@ class Ripper def on_heredoc_end(tok) @buf.push Elem.new([lineno(), column()], __callee__, tok, state()) - @buf = @stack.pop + @buf = @stack.pop unless @stack.empty? end def _push_token(tok) diff --git a/ext/ripper/ripper_init.c.tmpl b/ext/ripper/ripper_init.c.tmpl new file mode 100644 index 0000000000..08a9c4860b --- /dev/null +++ b/ext/ripper/ripper_init.c.tmpl @@ -0,0 +1,669 @@ +%# -*- c -*- +#include "ruby/ruby.h" +#include "ruby/encoding.h" +#include "internal.h" +#include "rubyparser.h" +#define YYSTYPE_IS_DECLARED +#include "parse.h" +#include "internal/parse.h" +#include "internal/ruby_parser.h" +#include "node.h" +#include "eventids1.h" +#include "eventids2.h" +#include "ripper_init.h" + +#define STR_NEW2(ptr) rb_enc_str_new((ptr),strlen(ptr),rb_ruby_parser_enc(p)) +#define RIPPER_VERSION "0.1.0" + +ID id_warn, id_warning, id_gets, id_assoc; + +enum lex_type { + lex_type_str, + lex_type_io, + lex_type_generic, +}; + +struct ripper { + rb_parser_t *p; + enum lex_type type; + union { + struct lex_pointer_string ptr_str; + VALUE val; + } data; +}; + +static void +ripper_parser_mark2(void *ptr) +{ + struct ripper *r = (struct ripper*)ptr; + if (r->p) { + ripper_parser_mark(r->p); + + switch (r->type) { + case lex_type_str: + rb_gc_mark(r->data.ptr_str.str); + break; + case lex_type_io: + rb_gc_mark(r->data.val); + break; + case lex_type_generic: + rb_gc_mark(r->data.val); + break; + } + } +} + +static void +ripper_parser_free2(void *ptr) +{ + struct ripper *r = (struct ripper*)ptr; + if (r->p) ripper_parser_free(r->p); + xfree(r); +} + +static size_t +ripper_parser_memsize2(const void *ptr) +{ + struct ripper *r = (struct ripper*)ptr; + return (r->p) ? ripper_parser_memsize(r->p) : 0; +} + +static const rb_data_type_t parser_data_type = { + "ripper", + { + ripper_parser_mark2, + ripper_parser_free2, + ripper_parser_memsize2, + }, + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY +}; + +static VALUE +ripper_lex_get_generic(struct parser_params *p, rb_parser_input_data input, int line_count) +{ + VALUE src = (VALUE)input; + VALUE line = rb_funcallv_public(src, id_gets, 0, 0); + if (!NIL_P(line) && !RB_TYPE_P(line, T_STRING)) { + rb_raise(rb_eTypeError, + "gets returned %"PRIsVALUE" (expected String or nil)", + rb_obj_class(line)); + } + return line; +} + +void +ripper_compile_error(struct parser_params *p, const char *fmt, ...) +{ + VALUE str; + va_list args; + + va_start(args, fmt); + str = rb_vsprintf(fmt, args); + va_end(args); + rb_funcall(ripper_value(p), rb_intern("compile_error"), 1, str); + ripper_error(p); +} + +static VALUE +ripper_lex_io_get(struct parser_params *p, rb_parser_input_data input, int line_count) +{ + VALUE src = (VALUE)input; + return rb_io_gets(src); +} + +static VALUE +ripper_lex_get_str(struct parser_params *p, rb_parser_input_data input, int line_count) +{ + return rb_parser_lex_get_str((struct lex_pointer_string *)input); +} + +static VALUE +ripper_s_allocate(VALUE klass) +{ + struct ripper *r; + + VALUE self = TypedData_Make_Struct(klass, struct ripper, + &parser_data_type, r); + +#ifdef UNIVERSAL_PARSER + const rb_parser_config_t *config = rb_ruby_parser_config(); + r->p = rb_ripper_parser_params_allocate(config); +#else + r->p = rb_ruby_ripper_parser_allocate(); +#endif + rb_ruby_parser_set_value(r->p, self); + return self; +} + +static struct parser_params * +ripper_parser_params(VALUE self, bool initialized) +{ + struct ripper *r; + struct parser_params *p; + + TypedData_Get_Struct(self, struct ripper, &parser_data_type, r); + p = r->p; + if (initialized && !rb_ruby_ripper_initialized_p(p)) { + rb_raise(rb_eArgError, "method called for uninitialized object"); + } + return p; +} + +/* + * call-seq: + * ripper.error? -> Boolean + * + * Return true if parsed source has errors. + */ +static VALUE +ripper_error_p(VALUE vparser) +{ + struct parser_params *p = ripper_parser_params(vparser, false); + + return RBOOL(rb_ruby_parser_error_p(p)); +} + +/* + * call-seq: + * ripper.end_seen? -> Boolean + * + * Return true if parsed source ended by +\_\_END\_\_+. + */ +static VALUE +ripper_parser_end_seen_p(VALUE vparser) +{ + struct parser_params *p = ripper_parser_params(vparser, false); + + return RBOOL(rb_ruby_parser_end_seen_p(p)); +} + +/* + * call-seq: + * ripper.encoding -> encoding + * + * Return encoding of the source. + */ +static VALUE +ripper_parser_encoding(VALUE vparser) +{ + struct parser_params *p = ripper_parser_params(vparser, false); + + return rb_enc_from_encoding(rb_ruby_parser_encoding(p)); +} + +/* + * call-seq: + * ripper.yydebug -> true or false + * + * Get yydebug. + */ +static VALUE +ripper_parser_get_yydebug(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, false); + + return RBOOL(rb_ruby_parser_get_yydebug(p)); +} + +/* + * call-seq: + * ripper.yydebug = flag + * + * Set yydebug. + */ +static VALUE +ripper_parser_set_yydebug(VALUE self, VALUE flag) +{ + struct parser_params *p = ripper_parser_params(self, false); + + rb_ruby_parser_set_yydebug(p, RTEST(flag)); + return flag; +} + +/* + * call-seq: + * ripper.debug_output -> obj + * + * Get debug output. + */ +static VALUE +ripper_parser_get_debug_output(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, false); + + return rb_ruby_parser_debug_output(p); +} + +/* + * call-seq: + * ripper.debug_output = obj + * + * Set debug output. + */ +static VALUE +ripper_parser_set_debug_output(VALUE self, VALUE output) +{ + struct parser_params *p = ripper_parser_params(self, false); + + rb_ruby_parser_set_debug_output(p, output); + return output; +} + +#ifdef UNIVERSAL_PARSER +struct dedent_string_arg { + struct parser_params *p; + VALUE input; + VALUE width; +}; + +static VALUE +parser_dedent_string0(VALUE a) +{ + struct dedent_string_arg *arg = (void *)a; + int wid, col; + + StringValue(arg->input); + wid = NUM2UINT(arg->width); + col = rb_ruby_ripper_dedent_string(arg->p, arg->input, wid); + return INT2NUM(col); +} + +static VALUE +parser_free(VALUE a) +{ + struct parser_params *p = (void *)a; + + rb_ruby_parser_free(p); + return Qnil; +} +#endif + +/* + * call-seq: + * Ripper.dedent_string(input, width) -> Integer + * + * USE OF RIPPER LIBRARY ONLY. + * + * Strips up to +width+ leading whitespaces from +input+, + * and returns the stripped column width. + */ +#ifdef UNIVERSAL_PARSER +static VALUE +parser_dedent_string(VALUE self, VALUE input, VALUE width) +{ + struct parser_params *p; + struct dedent_string_arg args; + + p = rb_parser_params_new(); + + args.p = p; + args.input = input; + args.width = width; + return rb_ensure(parser_dedent_string0, (VALUE)&args, parser_free, (VALUE)p); +} +#else +static VALUE +parser_dedent_string(VALUE self, VALUE input, VALUE width) +{ + int wid, col; + + StringValue(input); + wid = NUM2UINT(width); + col = rb_ruby_ripper_dedent_string(0, input, wid); + return INT2NUM(col); +} +#endif + +/* + * call-seq: + * Ripper.new(src, filename="(ripper)", lineno=1) -> ripper + * + * Create a new Ripper object. + * _src_ must be a String, an IO, or an Object which has #gets method. + * + * This method does not starts parsing. + * See also Ripper#parse and Ripper.parse. + */ +static VALUE +ripper_initialize(int argc, VALUE *argv, VALUE self) +{ + struct ripper *r; + struct parser_params *p; + VALUE src, fname, lineno; + rb_parser_lex_gets_func *gets; + VALUE sourcefile_string; + const char *sourcefile; + int sourceline; + rb_parser_input_data input; + + p = ripper_parser_params(self, false); + TypedData_Get_Struct(self, struct ripper, &parser_data_type, r); + rb_scan_args(argc, argv, "12", &src, &fname, &lineno); + if (RB_TYPE_P(src, T_FILE)) { + gets = ripper_lex_io_get; + r->type = lex_type_io; + r->data.val = src; + input = (rb_parser_input_data)src; + } + else if (rb_respond_to(src, id_gets)) { + gets = ripper_lex_get_generic; + r->type = lex_type_generic; + r->data.val = src; + input = (rb_parser_input_data)src; + } + else { + StringValue(src); + gets = ripper_lex_get_str; + r->type = lex_type_str; + r->data.ptr_str.str = src; + r->data.ptr_str.ptr = 0; + input = (rb_parser_input_data)&r->data.ptr_str; + } + if (NIL_P(fname)) { + fname = STR_NEW2("(ripper)"); + OBJ_FREEZE(fname); + } + else { + StringValueCStr(fname); + fname = rb_str_new_frozen(fname); + } + rb_ruby_ripper_parser_initialize(p); + + sourcefile_string = fname; + sourcefile = RSTRING_PTR(fname); + sourceline = NIL_P(lineno) ? 0 : NUM2INT(lineno) - 1; + + rb_ruby_parser_ripper_initialize(p, gets, input, sourcefile_string, sourcefile, sourceline); + + return Qnil; +} + +static VALUE +ripper_parse0(VALUE vparser) +{ + struct parser_params *p = ripper_parser_params(vparser, false); + + rb_ruby_ripper_parse0(p); + return rb_ruby_parser_result(p); +} + +static VALUE +ripper_ensure(VALUE vparser) +{ + struct parser_params *p = ripper_parser_params(vparser, false); + + rb_ruby_parser_set_parsing_thread(p, Qnil); + return Qnil; +} + +/* + * call-seq: + * ripper.parse + * + * Start parsing and returns the value of the root action. + */ +static VALUE +ripper_parse(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, true); + VALUE result; + + if (!NIL_P(rb_ruby_parser_parsing_thread(p))) { + if (rb_ruby_parser_parsing_thread(p) == rb_thread_current()) + rb_raise(rb_eArgError, "Ripper#parse is not reentrant"); + else + rb_raise(rb_eArgError, "Ripper#parse is not multithread-safe"); + } + rb_ruby_parser_set_parsing_thread(p, rb_thread_current()); + result = rb_ensure(ripper_parse0, self, ripper_ensure, self); + RB_GC_GUARD(self); + + return result; +} + +/* + * call-seq: + * ripper.column -> Integer + * + * Return column number of current parsing line. + * This number starts from 0. + */ +static VALUE +ripper_column(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, true); + long col; + + if (NIL_P(rb_ruby_parser_parsing_thread(p))) return Qnil; + col = rb_ruby_ripper_column(p); + return LONG2NUM(col); +} + +/* + * call-seq: + * ripper.filename -> String + * + * Return current parsing filename. + */ +static VALUE +ripper_filename(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, true); + + return rb_ruby_parser_ruby_sourcefile_string(p); +} + +/* + * call-seq: + * ripper.lineno -> Integer + * + * Return line number of current parsing line. + * This number starts from 1. + */ +static VALUE +ripper_lineno(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, true); + + if (NIL_P(rb_ruby_parser_parsing_thread(p))) return Qnil; + return INT2NUM(rb_ruby_parser_ruby_sourceline(p)); +} + +/* + * call-seq: + * ripper.state -> Integer + * + * Return scanner state of current token. + */ +static VALUE +ripper_state(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, true); + + if (NIL_P(rb_ruby_parser_parsing_thread(p))) return Qnil; + return INT2NUM(rb_ruby_parser_lex_state(p)); +} + +/* + * call-seq: + * ripper.token -> String + * + * Return the current token string. + */ +static VALUE +ripper_token(VALUE self) +{ + struct parser_params *p = ripper_parser_params(self, true); + long pos, len; + VALUE str; + + if (NIL_P(rb_ruby_parser_parsing_thread(p))) return Qnil; + pos = rb_ruby_ripper_column(p); + len = rb_ruby_ripper_token_len(p); + str = rb_str_new_parser_string(rb_ruby_ripper_lex_lastline(p)); + return rb_str_subseq(str, pos, len); +} + +#ifdef RIPPER_DEBUG +/* :nodoc: */ +static VALUE +ripper_assert_Qundef(VALUE self, VALUE obj, VALUE msg) +{ + StringValue(msg); + if (UNDEF_P(obj)) { + rb_raise(rb_eArgError, "%"PRIsVALUE, msg); + } + return Qnil; +} + +/* :nodoc: */ +static VALUE +ripper_raw_value(VALUE self, VALUE obj) +{ + return ULONG2NUM(obj); +} + +/* :nodoc: */ +static VALUE +ripper_validate_object(VALUE self, VALUE x) +{ + if (x == Qfalse) return x; + if (x == Qtrue) return x; + if (NIL_P(x)) return x; + if (UNDEF_P(x)) + rb_raise(rb_eArgError, "Qundef given"); + if (FIXNUM_P(x)) return x; + if (SYMBOL_P(x)) return x; + switch (BUILTIN_TYPE(x)) { + case T_STRING: + case T_OBJECT: + case T_ARRAY: + case T_BIGNUM: + case T_FLOAT: + case T_COMPLEX: + case T_RATIONAL: + break; + default: + rb_raise(rb_eArgError, "wrong type of ruby object: %p (%s)", + (void *)x, rb_obj_classname(x)); + } + if (!RBASIC_CLASS(x)) { + rb_raise(rb_eArgError, "hidden ruby object: %p (%s)", + (void *)x, rb_builtin_type_name(TYPE(x))); + } + return x; +} +#endif + +#ifdef UNIVERSAL_PARSER +struct lex_state_name_arg { + struct parser_params *p; + VALUE state; +}; + +static VALUE +lex_state_name0(VALUE a) +{ + struct lex_state_name_arg *arg = (void *)a; + + return rb_ruby_ripper_lex_state_name(arg->p, NUM2INT(arg->state)); +} +#endif + +/* + * call-seq: + * Ripper.lex_state_name(integer) -> string + * + * Returns a string representation of lex_state. + */ +#ifdef UNIVERSAL_PARSER +static VALUE +ripper_lex_state_name(VALUE self, VALUE state) +{ + struct parser_params *p; + struct lex_state_name_arg args; + + p = rb_parser_params_new(); + + args.p = p; + args.state = state; + + return rb_ensure(lex_state_name0, (VALUE)&args, parser_free, (VALUE)p); +} +#else +static VALUE +ripper_lex_state_name(VALUE self, VALUE state) +{ + return rb_ruby_ripper_lex_state_name(0, NUM2INT(state)); +} +#endif + +void +Init_ripper(void) +{ + ripper_init_eventids1(); + ripper_init_eventids2(); + id_warn = rb_intern_const("warn"); + id_warning = rb_intern_const("warning"); + id_gets = rb_intern_const("gets"); + id_assoc = rb_intern_const("=>"); + + InitVM(ripper); +} + +void +InitVM_ripper(void) +{ + VALUE Ripper; + + Ripper = rb_define_class("Ripper", rb_cObject); + /* version of Ripper */ + rb_define_const(Ripper, "Version", rb_usascii_str_new2(RIPPER_VERSION)); + rb_define_alloc_func(Ripper, ripper_s_allocate); + rb_define_method(Ripper, "initialize", ripper_initialize, -1); + rb_define_method(Ripper, "parse", ripper_parse, 0); + rb_define_method(Ripper, "column", ripper_column, 0); + rb_define_method(Ripper, "filename", ripper_filename, 0); + rb_define_method(Ripper, "lineno", ripper_lineno, 0); + rb_define_method(Ripper, "state", ripper_state, 0); + rb_define_method(Ripper, "token", ripper_token, 0); + rb_define_method(Ripper, "end_seen?", ripper_parser_end_seen_p, 0); + rb_define_method(Ripper, "encoding", ripper_parser_encoding, 0); + rb_define_method(Ripper, "yydebug", ripper_parser_get_yydebug, 0); + rb_define_method(Ripper, "yydebug=", ripper_parser_set_yydebug, 1); + rb_define_method(Ripper, "debug_output", ripper_parser_get_debug_output, 0); + rb_define_method(Ripper, "debug_output=", ripper_parser_set_debug_output, 1); + rb_define_method(Ripper, "error?", ripper_error_p, 0); +#ifdef RIPPER_DEBUG + rb_define_method(Ripper, "assert_Qundef", ripper_assert_Qundef, 2); + rb_define_method(Ripper, "rawVALUE", ripper_raw_value, 1); + rb_define_method(Ripper, "validate_object", ripper_validate_object, 1); +#endif + + 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%>)); +<% end %> + ripper_init_eventids1_table(Ripper); + ripper_init_eventids2_table(Ripper); + +# if 0 + /* Hack to let RDoc document SCRIPT_LINES__ */ + + /* + * When a Hash is assigned to +SCRIPT_LINES__+ the contents of files loaded + * after the assignment will be added as an Array of lines with the file + * name as the key. + */ + rb_define_global_const("SCRIPT_LINES__", Qnil); +#endif + rb_ripper_none = rb_obj_alloc(rb_cObject); + rb_obj_freeze(rb_ripper_none); + rb_gc_register_mark_object(rb_ripper_none); + +} diff --git a/ext/ripper/ripper_init.h b/ext/ripper/ripper_init.h new file mode 100644 index 0000000000..664bb7bce3 --- /dev/null +++ b/ext/ripper/ripper_init.h @@ -0,0 +1,7 @@ +#ifndef RIPPER_INIT_H +#define RIPPER_INIT_H + +extern VALUE rb_ripper_none; +PRINTF_ARGS(void ripper_compile_error(struct parser_params*, const char *fmt, ...), 2, 3); + +#endif /* RIPPER_INIT_H */ diff --git a/ext/ripper/tools/dsl.rb b/ext/ripper/tools/dsl.rb index 49ff51711f..3e368813e5 100644 --- a/ext/ripper/tools/dsl.rb +++ b/ext/ripper/tools/dsl.rb @@ -1,37 +1,46 @@ +# frozen_string_literal: true + # Simple DSL implementation for Ripper code generation # -# input: /*% ripper: stmts_add(stmts_new, void_stmt) %*/ +# input: /*% ripper: stmts_add!(stmts_new!, void_stmt!) %*/ # output: # VALUE v1, v2; # v1 = dispatch0(stmts_new); # v2 = dispatch0(void_stmt); # $$ = dispatch2(stmts_add, v1, v2); - -$dollar = "$$" -alias $$ $dollar +# +# - The code must be a single line. +# +# - The code is basically Ruby code, even if it appears like in C and +# the result will be processed as C. e.g., comments need to be in +# Ruby style. class DSL - def initialize(code, options) + TAG_PATTERN = /(?><[a-zA-Z0-9_]+>)/.source + NAME_PATTERN = /(?>\$|\d+|[a-zA-Z_][a-zA-Z0-9_]*|\[[a-zA-Z_.][-a-zA-Z0-9_.]*\])(?>(?:\.|->)[a-zA-Z_][a-zA-Z0-9_]*)*/.source + NOT_REF_PATTERN = /(?>\#.*|[^\"$@]*|"(?>\\.|[^\"])*")/.source + + def initialize(code, options, lineno = nil) + @lineno = lineno @events = {} @error = options.include?("error") @brace = options.include?("brace") if options.include?("final") @final = "p->result" else - @final = (options.grep(/\A\$(?:\$|\d+)\z/)[0] || "$$") + @final = (options.grep(/\A\$#{NAME_PATTERN}\z/o)[0] || "p->s_lvalue") end @vars = 0 - # create $1 == "$1", $2 == "$2", ... - s = (1..20).map {|n| "$#{n}"} - re = Array.new(s.size, "([^\0]+)") - /#{re.join("\0")}/ =~ s.join("\0") - # struct parser_params *p p = p = "p" - @code = "" + @code = +"" + code = code.gsub(%r[\G#{NOT_REF_PATTERN}\K(\$|\$:|@)#{TAG_PATTERN}?#{NAME_PATTERN}]o, '"\&"') @last_value = eval(code) + rescue SyntaxError + $stderr.puts "error on line #{@lineno}" if @lineno + raise end attr_reader :events @@ -62,11 +71,15 @@ class DSL vars = [] args.each do |arg| vars << v = new_var - @code << "#{ v }=#{ arg };" + if arg =~ /\A\$:#{NAME_PATTERN}\z/ + @code << "#{ v }=get_value(#{arg});" + else + @code << "#{ v }=#{ arg };" + end end v = new_var d = "dispatch#{ args.size }(#{ [event, *vars].join(",") })" - d = "#{ vars.last }==Qundef ? #{ vars.first } : #{ d }" if qundef_check + d = "#{ vars.last }==rb_ripper_none ? #{ vars.first } : #{ d }" if qundef_check @code << "#{ v }=#{ d };" v end @@ -85,4 +98,3 @@ class DSL name end end - diff --git a/ext/ripper/tools/generate.rb b/ext/ripper/tools/generate.rb index 883e6ef2df..27aa53bce0 100644 --- a/ext/ripper/tools/generate.rb +++ b/ext/ripper/tools/generate.rb @@ -11,7 +11,7 @@ def main parser = @parser = OptionParser.new parser.banner = "Usage: #{File.basename($0)} --mode=MODE [--ids1src=PATH] [--ids2src=PATH] [--output=PATH]" - parser.on('--mode=MODE', 'check, eventids1, or eventids2table.') {|m| + parser.on('--mode=MODE', 'check, eventids1_h, eventids1, or eventids2table.') {|m| mode = m } parser.on('--ids1src=PATH', 'A source file of event-IDs 1 (parse.y).') {|path| @@ -45,6 +45,9 @@ def main abort "event crash: #{common.join(' ')}" end exit 0 + when 'eventids1_h' + usage 'no --ids1src' unless ids1src + result = generate_eventids1_h(read_ids1(ids1src)) when 'eventids1' usage 'no --ids1src' unless ids1src result = generate_eventids1(read_ids1(ids1src)) @@ -67,19 +70,35 @@ def usage(msg) exit false end -def generate_eventids1(ids) +def generate_eventids1_h(ids) buf = "".dup - buf << %Q[static struct {\n] + buf << %Q[#ifndef RIPPER_EVENTIDS1\n] + buf << %Q[#define RIPPER_EVENTIDS1\n] + buf << %Q[\n] + buf << %Q[void ripper_init_eventids1(void);\n] + buf << %Q[void ripper_init_eventids1_table(VALUE self);\n] + buf << %Q[\n] + buf << %Q[struct ripper_parser_ids {\n] ids.each do |id, arity| buf << %Q[ ID id_#{id};\n] end - buf << %Q[} ripper_parser_ids;\n] + buf << %Q[};\n] buf << %Q[\n] ids.each do |id, arity| buf << %Q[#define ripper_id_#{id} ripper_parser_ids.id_#{id}\n] end + buf << %Q[#endif /* RIPPER_EVENTIDS1 */\n] + buf << %Q[\n] +end + +def generate_eventids1(ids) + buf = "".dup + buf << %Q[#include "ruby/ruby.h"\n] + buf << %Q[#include "eventids1.h"\n] buf << %Q[\n] - buf << %Q[static void\n] + buf << %Q[struct ripper_parser_ids ripper_parser_ids;\n] + buf << %Q[\n] + buf << %Q[void\n] buf << %Q[ripper_init_eventids1(void)\n] buf << %Q[{\n] buf << %Q[#define set_id1(name) ripper_id_##name = rb_intern_const("on_"#name)\n] @@ -88,7 +107,9 @@ def generate_eventids1(ids) end buf << %Q[}\n] buf << %Q[\n] - buf << %Q[static void\n] + buf << %Q[#define intern_sym(name) ID2SYM(rb_intern_const(name))\n] + buf << %Q[\n] + buf << %Q[void\n] buf << %Q[ripper_init_eventids1_table(VALUE self)\n] buf << %Q[{\n] buf << %Q[ VALUE h = rb_hash_new();\n] @@ -102,7 +123,11 @@ end def generate_eventids2_table(ids) buf = "".dup - buf << %Q[static void\n] + buf << %Q[#include "ruby/ruby.h"\n] + buf << %Q[\n] + buf << %Q[#define intern_sym(name) ID2SYM(rb_intern_const(name))\n] + buf << %Q[\n] + buf << %Q[void\n] buf << %Q[ripper_init_eventids2_table(VALUE self)\n] buf << %Q[{\n] buf << %Q[ VALUE h = rb_hash_new();\n] @@ -111,6 +136,8 @@ def generate_eventids2_table(ids) buf << %Q[ rb_hash_aset(h, intern_sym("#{id}"), INT2FIX(1));\n] end buf << %Q[}\n] + buf << %Q[\n] + buf << %Q[#define RIPPER_EVENTIDS2_TABLE_SIZE #{ids.size}\n] buf end @@ -140,14 +167,14 @@ require_relative "dsl" def read_ids1_with_locations(path) h = {} File.open(path) {|f| - f.each do |line| + f.each.with_index(1) do |line, i| next if /\A\#\s*define\s+dispatch/ =~ line next if /ripper_dispatch/ =~ line line.scan(/\bdispatch(\d)\((\w+)/) do |arity, event| (h[event] ||= []).push [f.lineno, arity.to_i] end if line =~ %r</\*% *ripper(?:\[(.*?)\])?: *(.*?) *%\*/> - gen = DSL.new($2, ($1 || "").split(",")) + gen = DSL.new($2, ($1 || "").split(","), i) gen.generate gen.events.each do |event, arity| (h[event] ||= []).push [f.lineno, arity.to_i] diff --git a/ext/ripper/tools/preproc.rb b/ext/ripper/tools/preproc.rb index b838a78db7..a54302fb91 100644 --- a/ext/ripper/tools/preproc.rb +++ b/ext/ripper/tools/preproc.rb @@ -5,11 +5,15 @@ require 'optparse' def main output = nil + template = nil parser = OptionParser.new - parser.banner = "Usage: #{File.basename($0)} [--output=PATH] <parse.y>" + parser.banner = "Usage: #{File.basename($0)} [--output=PATH] [--template=PATH] <parse.y>" parser.on('--output=PATH', 'An output file.') {|path| output = path } + parser.on('--template=PATH', 'An template file.') {|path| + template = path + } parser.on('--help', 'Prints this message and quit.') { puts parser.help exit true @@ -17,59 +21,56 @@ def main begin parser.parse! rescue OptionParser::ParseError => err - $stderr.puts err.message - $stderr.puts parser.help - exit false - end - unless ARGV.size == 1 - abort "wrong number of arguments (#{ARGV.size} for 1)" + warn err.message + abort parser.help end out = "".dup - File.open(ARGV[0]) {|f| - prelude f, out - grammar f, out - usercode f, out - } - if output - File.open(output, 'w') {|f| - f.write out + if ARGV[0] == "-" + unless ARGV.size == 2 + abort "wrong number of arguments (#{ARGV.size} for 2)" + end + process STDIN, out, ARGV[1], template + else + unless ARGV.size == 1 + abort "wrong number of arguments (#{ARGV.size} for 1)" + end + File.open(ARGV[0]) {|f| + process f, out, ARGV[0], template } + end + if output + File.write(output, out) else print out end end +def process(f, out, path, template) + prelude f, out + grammar f, out + usercode f, out, path, template +end + def prelude(f, out) @exprs = {} - lex_state_def = false while line = f.gets case line when /\A%%/ out << "%%\n" return - when /\A%token/ - out << line.sub(/<\w+>/, '<val>') - when /\A%type/ - out << line.sub(/<\w+>/, '<val>') - when /^enum lex_state_(?:bits|e) \{/ - lex_state_def = true - out << line - when /^\}/ - lex_state_def = false - out << line else - out << line - end - if lex_state_def - case line - when /^\s*(EXPR_\w+),\s+\/\*(.+)\*\// - @exprs[$1.chomp("_bit")] = $2.strip - when /^\s*(EXPR_\w+)\s+=\s+(.+)$/ - name = $1 - val = $2.chomp(",") - @exprs[name] = "equals to " + (val.start_with?("(") ? "<tt>#{val}</tt>" : "+#{val}+") + if (/^enum lex_state_(?:bits|e) \{/ =~ line)..(/^\}/ =~ line) + case line + when /^\s*(EXPR_\w+),\s+\/\*(.+)\*\// + @exprs[$1.chomp("_bit")] = $2.strip + when /^\s*(EXPR_\w+)\s+=\s+(.+)$/ + name = $1 + val = $2.chomp(",") + @exprs[name] = "equals to " + (val.start_with?("(") ? "<tt>#{val}</tt>" : "+#{val}+") + end end end + out << line end end @@ -95,13 +96,26 @@ def grammar(f, out) end end -def usercode(f, out) +def usercode(f, out, path, template) require 'erb' + lineno = nil + src = nil compiler = ERB::Compiler.new('%-') compiler.put_cmd = compiler.insert_cmd = "out.<<" - lineno = f.lineno - src, = compiler.compile(f.read) - eval(src, binding, f.path, lineno) + + if template + File.open(template) do |f| + out.clear + lineno = f.lineno + src, = compiler.compile(f.read) + path = template + end + else + lineno = f.lineno + src, = compiler.compile(f.read) + end + + eval(src, binding, path, lineno) end main |