Determine output language by output file extension

This commit is contained in:
Josh Holtrop 2023-08-20 16:27:58 -04:00
parent 2b515e1a7a
commit 9d2b3be20b

View File

@ -11,14 +11,26 @@ class Propane
@log = StringIO.new @log = StringIO.new
end end
@classname = @grammar.classname || File.basename(output_file).sub(%r{[^a-zA-Z0-9].*}, "").capitalize @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! process_grammar!
end end
def generate def generate
erb = ERB.new(File.read(File.join(File.dirname(File.expand_path(__FILE__)), "../../assets/parser.d.erb")), trim_mode: "<>") extensions = [@language]
result = erb.result(binding.clone) if @language == "c"
File.open(@output_file, "wb") do |fh| extensions += %w[h]
fh.write(result) 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 end
@log.close @log.close
end end
@ -191,7 +203,12 @@ class Propane
end end
code = code.gsub(/\$(\d+)/) do |match| code = code.gsub(/\$(\d+)/) do |match|
index = $1.to_i 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 end
else else
code = code.gsub(/\$\$/) do |match| code = code.gsub(/\$\$/) do |match|