diff --git a/lib/lrama/command.rb b/lib/lrama/command.rb index 213b7acb..eff31e46 100644 --- a/lib/lrama/command.rb +++ b/lib/lrama/command.rb @@ -8,7 +8,7 @@ def run(argv) warning = Lrama::Warning.new text = options.y.read options.y.close if options.y != STDIN - grammar = Lrama::NewParser.new(text).parse + grammar = Lrama::NewParser.new(text, options.header_file).parse states = Lrama::States.new(grammar, warning, trace_state: (options.trace_opts[:automaton] || options.trace_opts[:closure])) states.compute context = Lrama::Context.new(states) diff --git a/lib/lrama/new_parser.rb b/lib/lrama/new_parser.rb index a18e127a..2bfd6a66 100644 --- a/lib/lrama/new_parser.rb +++ b/lib/lrama/new_parser.rb @@ -10,8 +10,9 @@ class NewParser < Racc::Parser module_eval(<<'...end parser.y/module_eval...', 'parser.y', 121) -def initialize(text) +def initialize(text, header_file) @text = text + @header_path = header_file ? header_file.sub("./", "") : nil @lineno = [] @column = [] end @@ -41,6 +42,14 @@ def build_token(type:, s_value:, line:, column:, alias_name: nil) token end + +def prologue(s_value) + if @header_path + "\n#include \"#{@header_path}\"\n" + s_value + else + s_value + end +end ...end parser.y/module_eval... ##### State transition tables begin ### @@ -474,7 +483,7 @@ def _reduce_5(val, _values, result) module_eval(<<'.,.,', 'parser.y', 7) def _reduce_6(val, _values, result) - @grammar.prologue = val[2] + @grammar.prologue = prologue(val[2]) result end .,., diff --git a/parser.y b/parser.y index 9f601011..a241f1c7 100644 --- a/parser.y +++ b/parser.y @@ -5,7 +5,7 @@ rule prologue_declarations: # empty | prologue_declarations prologue_declaration - prologue_declaration: "%{" {@lexer.status = :c_declaration; @lexer.end_symbol = '%}'; @grammar.prologue_first_lineno = @lexer.line} C_DECLARATION {@lexer.status = :initial; @lexer.end_symbol = nil} "%}" { @grammar.prologue = val[2] } + prologue_declaration: "%{" {@lexer.status = :c_declaration; @lexer.end_symbol = '%}'; @grammar.prologue_first_lineno = @lexer.line} C_DECLARATION {@lexer.status = :initial; @lexer.end_symbol = nil} "%}" { @grammar.prologue = prologue(val[2]) } | "%require" STRING bison_declarations: /* empty */ { result = "" } @@ -119,8 +119,9 @@ end ---- inner -def initialize(text) +def initialize(text, header_file) @text = text + @header_path = header_file ? header_file.sub("./", "") : nil @lineno = [] @column = [] end @@ -150,3 +151,11 @@ def build_token(type:, s_value:, line:, column:, alias_name: nil) token end + +def prologue(s_value) + if @header_path + "\n#include \"#{@header_path}\"\n" + s_value + else + s_value + end +end