From 07dd68e367f4fc5fdf269b7944606432e669c14d Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Sat, 1 May 2021 16:44:01 -0400 Subject: [PATCH] Write output file from ERB template --- assets/parser.d.erb | 7 +++++++ lib/imbecile.rb | 7 +++++++ lib/imbecile/grammar.rb | 10 +++++++++- 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 assets/parser.d.erb diff --git a/assets/parser.d.erb b/assets/parser.d.erb new file mode 100644 index 0000000..c0f45bf --- /dev/null +++ b/assets/parser.d.erb @@ -0,0 +1,7 @@ +<% if grammar.modulename %> +module <%= grammar.modulename %>; + +<% end %> +class <%= classname %> +{ +} diff --git a/lib/imbecile.rb b/lib/imbecile.rb index bf69f49..193f0f7 100644 --- a/lib/imbecile.rb +++ b/lib/imbecile.rb @@ -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 diff --git a/lib/imbecile/grammar.rb b/lib/imbecile/grammar.rb index ae03cad..35b1303 100644 --- a/lib/imbecile/grammar.rb +++ b/lib/imbecile/grammar.rb @@ -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]*$/