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

Instance Method Details

#append_entry_methods(lines) ⇒ void

This method returns an undefined value.

RBS:

  • (Array[String] lines) -> void

Parameters:

  • lines (Array[String])


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.

RBS:

  • (Array[String] lines, String indent) -> void

Parameters:

  • lines (Array[String])
  • indent (String)


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_fieldsString

RBS:

  • () -> String

Returns:

  • (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_fieldsString

RBS:

  • () -> String

Returns:

  • (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