Module: Ibex::Codegen::RubyTableMetadata
- Included in:
- Ruby
- Defined in:
- lib/ibex/codegen/ruby_table_metadata.rb,
sig/ibex/codegen/ruby_table_metadata.rbs
Overview
Emits immutable identity and size metadata for generated parser tables.
Instance Method Summary collapse
- #append_entry_methods(lines) ⇒ void
- #append_table_metadata(lines, indent) ⇒ void
- #entry_table_fields ⇒ String
- #recovery_table_fields ⇒ String
Instance Method Details
#append_entry_methods(lines) ⇒ void
This method returns an undefined value.
26 27 28 29 30 31 32 33 34 35 |
# File 'lib/ibex/codegen/ruby_table_metadata.rb', line 26 def append_entry_methods(lines) return unless @grammar.starts.length > 1 @grammar.starts.each do |name| lines << " def parse_#{name}" lines << " drive_parser(-> { next_token }, initial_state: ENTRY_STATES.fetch(:#{name}))" lines << " end" lines << "" end end |
#append_table_metadata(lines, indent) ⇒ void
This method returns an undefined value.
14 15 16 17 18 19 20 21 22 23 |
# File 'lib/ibex/codegen/ruby_table_metadata.rb', line 14 def (lines, indent) lines << "#{indent}PARSER_TABLE_FORMAT_VERSION = #{Runtime::PARSER_TABLE_FORMAT_VERSION}" lines << "#{indent}GRAMMAR_DIGEST = #{@automaton.grammar_digest.inspect}.freeze" lines << "#{indent}STATE_COUNT = #{@automaton.states.length}" lines << "#{indent}PRODUCTION_COUNT = #{@grammar.productions.length}" return unless @grammar.starts.length > 1 entries = @automaton.entry_states.map { |name, state| "#{name.to_sym.inspect} => #{state}" } lines << "#{indent}ENTRY_STATES = { #{entries.join(', ')} }.freeze" end |
#entry_table_fields ⇒ String
38 39 40 41 42 |
# File 'lib/ibex/codegen/ruby_table_metadata.rb', line 38 def entry_table_fields return "" unless @grammar.starts.length > 1 " initial_state: ENTRY_STATES.fetch(:#{@grammar.start}), entry_states: ENTRY_STATES," end |
#recovery_table_fields ⇒ String
45 46 47 48 49 50 51 52 53 54 |
# File 'lib/ibex/codegen/ruby_table_metadata.rb', line 45 def recovery_table_fields names = @grammar.recovery[:sync_tokens] return "" if names.empty? ids = names.map do |name| symbol = @grammar.symbol(name) || raise(Ibex::Error, "missing recovery sync token #{name}") symbol.id end " recovery_sync_tokens: #{ids.inspect}.freeze," end |