diff --git a/lib/propane/generator.rb b/lib/propane/generator.rb index b90bf79..4a6fac4 100644 --- a/lib/propane/generator.rb +++ b/lib/propane/generator.rb @@ -11,14 +11,26 @@ class Propane @log = StringIO.new end @classname = @grammar.classname || File.basename(output_file).sub(%r{[^a-zA-Z0-9].*}, "").capitalize + @language = + if output_file =~ /\.([a-z]+)$/ + $1 + else + "d" + end process_grammar! end def generate - erb = ERB.new(File.read(File.join(File.dirname(File.expand_path(__FILE__)), "../../assets/parser.d.erb")), trim_mode: "<>") - result = erb.result(binding.clone) - File.open(@output_file, "wb") do |fh| - fh.write(result) + extensions = [@language] + if @language == "c" + extensions += %w[h] + end + extensions.each do |extension| + erb = ERB.new(File.read(File.join(File.dirname(File.expand_path(__FILE__)), "../../assets/parser.#{extension}.erb")), trim_mode: "<>") + result = erb.result(binding.clone) + File.open(@output_file.sub(%r{\.[a-z]+$}, ".#{extension}"), "wb") do |fh| + fh.write(result) + end end @log.close end @@ -191,7 +203,12 @@ class Propane end code = code.gsub(/\$(\d+)/) do |match| index = $1.to_i - "statevalues[$-1-n_states+#{index}].pvalue.v_#{rule.components[index - 1].ptypename}" + case @language + when "d" + "statevalues[$-1-n_states+#{index}].pvalue.v_#{rule.components[index - 1].ptypename}" + when "c" + "state_value_stack_index(statevalues, -1 - (int)n_states + #{index})->pvalue.v_#{rule.components[index - 1].ptypename}" + end end else code = code.gsub(/\$\$/) do |match|