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
126 127 128 129 130 131 132 133 134 135 136 |
# File 'tools/generate.rb', line 126 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
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 101 |
# File 'tools/generate.rb', line 70 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
103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'tools/generate.rb', line 103 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
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'tools/preproc.rb', line 64 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
7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'extconf.rb', line 7 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
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'tools/preproc.rb', line 42 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
117 118 119 |
# File 'tools/generate.rb', line 117 def read_ids1(path) strip_locations(read_ids1_with_locations(path)) end |
#read_ids1_with_locations(path) ⇒ Object
138 139 140 141 142 143 144 145 146 147 148 149 150 |
# File 'tools/generate.rb', line 138 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
152 153 154 155 156 157 158 159 160 |
# File 'tools/generate.rb', line 152 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
121 122 123 124 |
# File 'tools/generate.rb', line 121 def strip_locations(h) h.map {|event, list| [event, list.first[1]] }\ .sort_by {|event, arity| event.to_s } end |
#usage(msg) ⇒ Object
64 65 66 67 68 |
# File 'tools/generate.rb', line 64 def usage(msg) $stderr.puts msg $stderr.puts @parser.help exit false end |
#usercode(f, out) ⇒ Object
86 87 88 89 90 |
# File 'tools/preproc.rb', line 86 def usercode(f, out) while line = f.gets out << line end end |