Determine output language by output file extension
This commit is contained in:
parent
2b515e1a7a
commit
9d2b3be20b
@ -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|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user