Class: Parse::LaLr1ParseTableGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/rpdf2txt-rockit/lalr_parsetable_generator.rb

Instance Method Summary collapse

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_uniquenessObject



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