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
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|