Top Level Namespace
Defined Under Namespace
Constant Summary collapse
- 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. Qnil
Instance Method Summary collapse
- #check_arity(h) ⇒ Object
- #generate_eventids1(ids) ⇒ Object
- #generate_eventids2_table(ids) ⇒ Object
- #grammar(f, out) ⇒ Object
- #main ⇒ Object
- #prelude(f, out) ⇒ Object
- #read_ids1(path) ⇒ Object
- #read_ids1_with_locations(path) ⇒ Object
- #read_ids2(path) ⇒ Object
- #strip_locations(h) ⇒ Object
- #usage(msg) ⇒ Object
- #usercode(f, out) ⇒ Object
Instance Method Details
#check_arity(h) ⇒ Object
125 126 127 128 129 130 131 132 133 134 135 |
# File 'tools/generate.rb', line 125 def check_arity(h) invalid = false h.each do |event, list| unless list.map {|line, arity| arity }.uniq.size == 1 invalid = true locations = list.map {|line, a| "#{line}:#{a}" }.join(', ') $stderr.puts "arity crash [event=#{event}]: #{locations}" end end abort if invalid end |
#generate_eventids1(ids) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# File 'tools/generate.rb', line 69 def generate_eventids1(ids) buf = "" buf << %Q[static struct {\n] ids.each do |id, arity| buf << %Q[ ID id_#{id};\n] end buf << %Q[} ripper_parser_ids;\n] buf << %Q[\n] ids.each do |id, arity| buf << %Q[#define ripper_id_#{id} ripper_parser_ids.id_#{id}\n] end buf << %Q[\n] buf << %Q[static 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] ids.each do |id, arity| buf << %Q[ set_id1(#{id});\n] end buf << %Q[}\n] buf << %Q[\n] buf << %Q[static void\n] buf << %Q[ripper_init_eventids1_table(VALUE self)\n] buf << %Q[{\n] buf << %Q[ VALUE h = rb_hash_new();\n] buf << %Q[ rb_define_const(self, "PARSER_EVENT_TABLE", h);\n] ids.each do |id, arity| buf << %Q[ rb_hash_aset(h, intern_sym("#{id}"), INT2FIX(#{arity}));\n] end buf << %Q[}\n] buf end |
#generate_eventids2_table(ids) ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'tools/generate.rb', line 102 def generate_eventids2_table(ids) buf = "" buf << %Q[static void\n] buf << %Q[ripper_init_eventids2_table(VALUE self)\n] buf << %Q[{\n] buf << %Q[ VALUE h = rb_hash_new();\n] buf << %Q[ rb_define_const(self, "SCANNER_EVENT_TABLE", h);\n] ids.each do |id| buf << %Q[ rb_hash_aset(h, intern_sym("#{id}"), INT2FIX(1));\n] end buf << %Q[}\n] buf end |
#grammar(f, out) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# File 'tools/preproc.rb', line 63 def grammar(f, out) while line = f.gets case line when %r</\*%%%\*/> out << '#if 0' << $/ when %r</\*%c%\*/> out << '/*' << $/ when %r</\*%c> out << '*/' << $/ when %r</\*%> out << '#endif' << $/ when %r<%\*/> out << $/ when /\A%%/ out << '%%' << $/ return else out << line end end end |
#main ⇒ Object
6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# File 'extconf.rb', line 6 def main unless find_executable('bison') 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) $defs << '-DRIPPER' $defs << '-DRIPPER_DEBUG' if $debug $VPATH << '$(topdir)' << '$(top_srcdir)' $INCFLAGS << ' -I$(topdir) -I$(top_srcdir)' create_makefile 'ripper' end |
#prelude(f, out) ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'tools/preproc.rb', line 41 def prelude(f, out) while line = f.gets case line when %r</\*%%%\*/> out << '/*' << $/ when %r</\*%> out << '*/' << $/ when %r<%\*/> out << $/ when /\A%%/ out << '%%' << $/ return when /\A%token/ out << line.sub(/<\w+>/, '<val>') when /\A%type/ out << line.sub(/<\w+>/, '<val>') else out << line end end end |
#read_ids1(path) ⇒ Object
116 117 118 |
# File 'tools/generate.rb', line 116 def read_ids1(path) strip_locations(read_ids1_with_locations(path)) end |
#read_ids1_with_locations(path) ⇒ Object
137 138 139 140 141 142 143 144 145 146 147 148 149 |
# File 'tools/generate.rb', line 137 def read_ids1_with_locations(path) h = {} File.open(path) {|f| f.each do |line| 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 end } h end |
#read_ids2(path) ⇒ Object
151 152 153 154 155 156 157 158 159 |
# File 'tools/generate.rb', line 151 def read_ids2(path) src = File.open(path) {|f| f.read} ids2 = src.scan(/ID\s+ripper_id_(\w+)/).flatten.uniq.sort diff = src.scan(/set_id2\((\w+)\);/).flatten - ids2 unless diff.empty? abort "missing scanner IDs: #{diff}" end return ids2 end |
#strip_locations(h) ⇒ Object
120 121 122 123 |
# File 'tools/generate.rb', line 120 def strip_locations(h) h.map {|event, list| [event, list.first[1]] }\ .sort_by {|event, arity| event.to_s } end |
#usage(msg) ⇒ Object
63 64 65 66 67 |
# File 'tools/generate.rb', line 63 def usage(msg) $stderr.puts msg $stderr.puts @parser.help exit false end |
#usercode(f, out) ⇒ Object
85 86 87 88 89 |
# File 'tools/preproc.rb', line 85 def usercode(f, out) while line = f.gets out << line end end |