lib/lrama/command.rb in lrama-0.5.5 vs lib/lrama/command.rb in lrama-0.5.6
- old
+ new
@@ -1,162 +1,40 @@
-require 'optparse'
-
module Lrama
class Command
- def initialize(argv)
- @argv = argv
+ def run(argv)
+ options = OptionParser.new.parse(argv)
- @skeleton = "bison/yacc.c"
- @header = false
- @header_file = nil
- @report = []
- @report_file = nil
- @outfile = "y.tab.c"
- @trace = []
- @error_recovery = false
- @grammar_file = nil
- @report_file = nil
- @trace_opts = nil
- @report_opts = nil
- end
+ Report::Duration.enable if options.trace_opts[:time]
- def run
- parse_option
-
- Report::Duration.enable if @trace_opts[:time]
-
warning = Lrama::Warning.new
- grammar = Lrama::Parser.new(@y.read).parse
- @y.close if @y != STDIN
- states = Lrama::States.new(grammar, warning, trace_state: (@trace_opts[:automaton] || @trace_opts[:closure]))
+ grammar = Lrama::Parser.new(options.y.read).parse
+ options.y.close if options.y != STDIN
+ states = Lrama::States.new(grammar, warning, trace_state: (options.trace_opts[:automaton] || options.trace_opts[:closure]))
states.compute
context = Lrama::Context.new(states)
- if @report_file
+ if options.report_file
reporter = Lrama::StatesReporter.new(states)
- File.open(@report_file, "w+") do |f|
- reporter.report(f, **@report_opts)
+ File.open(options.report_file, "w+") do |f|
+ reporter.report(f, **options.report_opts)
end
end
- File.open(@outfile, "w+") do |f|
+ File.open(options.outfile, "w+") do |f|
Lrama::Output.new(
out: f,
- output_file_path: @outfile,
- template_name: @skeleton,
- grammar_file_path: @grammar_file,
- header_file_path: @header_file,
+ output_file_path: options.outfile,
+ template_name: options.skeleton,
+ grammar_file_path: options.grammar_file,
+ header_file_path: options.header_file,
context: context,
grammar: grammar,
- error_recovery: @error_recovery,
+ error_recovery: options.error_recovery,
).render
end
if warning.has_error?
exit 1
- end
- end
-
- private
-
- def validate_report(report)
- bison_list = %w[states itemsets lookaheads solved counterexamples cex all none]
- others = %w[verbose]
- list = bison_list + others
- not_supported = %w[cex none]
- h = { grammar: true }
-
- report.each do |r|
- if list.include?(r) && !not_supported.include?(r)
- h[r.to_sym] = true
- else
- raise "Invalid report option \"#{r}\"."
- end
- end
-
- if h[:all]
- (bison_list - not_supported).each do |r|
- h[r.to_sym] = true
- end
-
- h.delete(:all)
- end
-
- return h
- end
-
- def validate_trace(trace)
- list = %w[
- none locations scan parse automaton bitsets
- closure grammar resource sets muscles tools
- m4-early m4 skeleton time ielr cex all
- ]
- h = {}
-
- trace.each do |t|
- if list.include?(t)
- h[t.to_sym] = true
- else
- raise "Invalid trace option \"#{t}\"."
- end
- end
-
- return h
- end
-
- def parse_option
- opt = OptionParser.new
-
- # opt.on('-h') {|v| p v }
- opt.on('-V', '--version') {|v| puts "lrama #{Lrama::VERSION}"; exit 0 }
-
- # Tuning the Parser
- opt.on('-S', '--skeleton=FILE') {|v| @skeleton = v }
- opt.on('-t') { } # Do nothing
-
- # Output Files:
- opt.on('-h', '--header=[FILE]') {|v| @header = true; @header_file = v }
- opt.on('-d') { @header = true }
- opt.on('-r', '--report=THINGS', Array) {|v| @report = v }
- opt.on('--report-file=FILE') {|v| @report_file = v }
- opt.on('-v') { } # Do nothing
- opt.on('-o', '--output=FILE') {|v| @outfile = v }
-
- # Hidden
- opt.on('--trace=THINGS', Array) {|v| @trace = v }
-
- # Error Recovery
- opt.on('-e') {|v| @error_recovery = true }
-
- opt.parse!(@argv)
-
- @trace_opts = validate_trace(@trace)
- @report_opts = validate_report(@report)
-
- @grammar_file = @argv.shift
-
- if !@grammar_file
- abort "File should be specified\n"
- end
-
- if @grammar_file == '-'
- @grammar_file = @argv.shift or abort "File name for STDIN should be specified\n"
- @y = STDIN
- else
- @y = File.open(@grammar_file, 'r')
- end
-
- if !@report.empty? && @report_file.nil? && @grammar_file
- @report_file = File.dirname(@grammar_file) + "/" + File.basename(@grammar_file, ".*") + ".output"
- end
-
- if !@header_file && @header
- case
- when @outfile
- @header_file = File.dirname(@outfile) + "/" + File.basename(@outfile, ".*") + ".h"
- when @grammar_file
- @header_file = File.dirname(@grammar_file) + "/" + File.basename(@grammar_file, ".*") + ".h"
- end
end
end
end
end