Add Generator class
This commit is contained in:
parent
a34272dfd6
commit
d2fac07249
@ -1,5 +1,5 @@
|
|||||||
<% if grammar.modulename %>
|
<% if @grammar.modulename %>
|
||||||
module <%= grammar.modulename %>;
|
module <%= @grammar.modulename %>;
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
class <%= classname %>
|
class <%= classname %>
|
||||||
|
@ -2,6 +2,7 @@ require "erb"
|
|||||||
require "set"
|
require "set"
|
||||||
require_relative "imbecile/cli"
|
require_relative "imbecile/cli"
|
||||||
require_relative "imbecile/code_point_range"
|
require_relative "imbecile/code_point_range"
|
||||||
|
require_relative "imbecile/generator"
|
||||||
require_relative "imbecile/grammar"
|
require_relative "imbecile/grammar"
|
||||||
require_relative "imbecile/grammar/rule"
|
require_relative "imbecile/grammar/rule"
|
||||||
require_relative "imbecile/grammar/token"
|
require_relative "imbecile/grammar/token"
|
||||||
@ -24,22 +25,12 @@ module Imbecile
|
|||||||
def run(input_file, output_file)
|
def run(input_file, output_file)
|
||||||
begin
|
begin
|
||||||
grammar = Grammar.new(File.read(input_file))
|
grammar = Grammar.new(File.read(input_file))
|
||||||
# Build NFA from each token expression.
|
generator = Generator.new(grammar)
|
||||||
grammar.tokens.each do |token|
|
generator.generate(output_file)
|
||||||
puts token.nfa
|
|
||||||
end
|
|
||||||
lexer_dfa = LexerDFA.new(grammar.tokens)
|
|
||||||
puts lexer_dfa
|
|
||||||
rescue Error => e
|
rescue Error => e
|
||||||
$stderr.puts e.message
|
$stderr.puts e.message
|
||||||
return 2
|
return 2
|
||||||
end
|
end
|
||||||
classname = grammar.classname || output_file.sub(%r{[^a-zA-Z0-9].*}, "").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
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
22
lib/imbecile/generator.rb
Normal file
22
lib/imbecile/generator.rb
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
module Imbecile
|
||||||
|
|
||||||
|
# Class to generate the parser generator source.
|
||||||
|
class Generator
|
||||||
|
|
||||||
|
def initialize(grammar)
|
||||||
|
@grammar = grammar
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate(output_file)
|
||||||
|
lexer_dfa = LexerDFA.new(@grammar.tokens)
|
||||||
|
classname = @grammar.classname || output_file.sub(%r{[^a-zA-Z0-9].*}, "").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
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
Loading…
x
Reference in New Issue
Block a user