Write output file from ERB template

This commit is contained in:
Josh Holtrop 2021-05-01 16:44:01 -04:00
parent c1666a1e74
commit 07dd68e367
3 changed files with 23 additions and 1 deletions

7
assets/parser.d.erb Normal file
View File

@ -0,0 +1,7 @@
<% if grammar.modulename %>
module <%= grammar.modulename %>;
<% end %>
class <%= classname %>
{
}

View File

@ -1,6 +1,7 @@
require_relative "imbecile/cli"
require_relative "imbecile/grammar"
require_relative "imbecile/version"
require "erb"
module Imbecile
@ -11,6 +12,12 @@ module Imbecile
unless grammar.load(input_file)
return 2
end
classname = grammar.classname || grammar.capitalize
erb = ERB.new(File.read(File.join(File.dirname(File.expand_path(__FILE__)), "../assets/parser.d.erb")), nil, "<>")
result = erb.result(binding.clone)
File.open(output_file, "wb") do |fh|
fh.write(result)
end
return 0
end

View File

@ -1,6 +1,12 @@
module Imbecile
class Grammar
# @return [String, nil] Module name.
attr_reader :modulename
# @return [String, nil] Class name.
attr_reader :classname
def initialize
@tokens = {}
@rules = {}
@ -16,8 +22,10 @@ module Imbecile
# Skip comment lines.
elsif line =~ /^\s*$/
# Skip blank lines.
elsif line =~ /^\s*module\s+(\S+)$/
@modulename = $1
elsif line =~ /^\s*class\s+(\S+)$/
@class = $1
@classname = $1
elsif line =~ /^\s*token\s+(\S+)\s+(.*)$/
name, expr = $1, $2
unless name =~ /^[a-zA-Z_][a-zA-Z_0-9]*$/