Class: Parse::LaLr1ParseTableGenerator
- Defined in:
- lib/rpdf2txt-rockit/lalr_parsetable_generator.rb
Instance Method Summary collapse
- #generate_parse_table(parseTableKlass = ParseTable) ⇒ Object
-
#initialize(grammar, lookaheadCalculatorKlass = ReduceActionsGenerator) ⇒ LaLr1ParseTableGenerator
constructor
A new instance of LaLr1ParseTableGenerator.
- #test_nonterminal_uniqueness ⇒ Object
Constructor Details
#initialize(grammar, lookaheadCalculatorKlass = ReduceActionsGenerator) ⇒ LaLr1ParseTableGenerator
47 48 49 50 51 |
# File 'lib/rpdf2txt-rockit/lalr_parsetable_generator.rb', line 47 def initialize(grammar, lookaheadCalculatorKlass = ReduceActionsGenerator) @grammar, @lookahead_calculator_klass = grammar, lookaheadCalculatorKlass end |
Instance Method Details
#generate_parse_table(parseTableKlass = ParseTable) ⇒ Object
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/rpdf2txt-rockit/lalr_parsetable_generator.rb', line 53 def generate_parse_table(parseTableKlass = ParseTable) @grammar.augment #puts "\n NoN = #{@grammar.productions.map{|p| p.nonterminal}.uniq.length}" #puts " NoP = #{@grammar.productions.length}" time_and_puts("\n Normalizing grammar") { @grammar.normalize } #puts " NoPN = #{@grammar.productions.length}" state_graph = nil time_and_puts(" Calculating states") { @item_factory = IndexableFactory.new(Item, 0) @state_factory = IndexableFactory.new(LrState, 0) precalc_nonkernel_items_for_nonterminals @parse_table = parseTableKlass.new_from_grammar(@grammar) state_graph = calculate_state_graph # also adds gotos and shift actions } time_and_puts(" Calculating lalr1_lookaheads") { lookahead_alg = @lookahead_calculator_klass.new(state_graph, @grammar, @parse_table, @item_factory.instances) lookahead_alg.add_reduce_actions } @parse_table end |
#test_nonterminal_uniqueness ⇒ Object
78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/rpdf2txt-rockit/lalr_parsetable_generator.rb', line 78 def test_nonterminal_uniqueness nts = DefaultInitHash.new {|k| Array.new} @grammar.productions.each do |production| nts[production.nonterminal.name].push(production.nonterminal.id) nts[production.nonterminal.name].uniq! production.elements.each do |e| if e.nonterminal? nts[e.name].push(e.id) nts[e.name].uniq! end end end puts nts.inspect end |