Class: Ibex::Codegen::CSTMetadata

Inherits:
Object
  • Object
show all
Defined in:
lib/ibex/codegen/cst_metadata.rb

Overview

Builds the deterministic kind space embedded in CST-aware parser tables.

Constant Summary collapse

TRIVIA_KINDS =

@rbs! type kind_map = Hash[String, Integer] type kinds = { names: Array, terminal_range: Array, nonterminal_range: Array, named: kind_map, named_nonterminals: Hash[Integer, Integer], trivia: kind_map, synthetic: kind_map } type field_slot = Integer | { index: Integer, extraction: Symbol } type slot = { node_kind: Integer, node_name: String, fields: Hash[String, field_slot] } type metadata = { version: Integer, trivia_policy: Symbol, kinds: kinds, slots: Hash[Integer, slot] }

%w[
  whitespace
  newline
  line_comment
  block_comment
  custom_skip
  skipped_tokens
].freeze
SYNTHETIC_KINDS =

: Array

%w[
  lexical_error_token
  missing_token
  error_node
  source_file
  synthetic_root
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(grammar, trivia_policy: :leading) ⇒ CSTMetadata

Returns a new instance of CSTMetadata.



49
50
51
52
# File 'lib/ibex/codegen/cst_metadata.rb', line 49

def initialize(grammar, trivia_policy: :leading)
  @grammar = grammar
  @trivia_policy = normalize_trivia_policy(trivia_policy)
end

Instance Method Details

#buildObject

Return table-ready CST metadata with stable insertion order.



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/ibex/codegen/cst_metadata.rb', line 56

def build
  names = @grammar.symbols.sort_by(&:id).map(&:name)
  named = append_named_kinds(names)
  trivia = append_kinds(names, TRIVIA_KINDS)
  synthetic = append_kinds(names, SYNTHETIC_KINDS)
  terminals = @grammar.terminals.map(&:id)
  nonterminals = @grammar.nonterminals.map(&:id)
  kinds = {
    names: names.freeze,
    terminal_range: half_open_range(terminals),
    nonterminal_range: half_open_range(nonterminals),
    named: named.freeze,
    named_nonterminals: named_nonterminals(named).freeze,
    trivia: trivia.freeze,
    synthetic: synthetic.freeze
  }.freeze #: kinds
   = { # rubocop:disable Style/RedundantAssignment -- preserves the exact record type for Steep.
    version: 1, trivia_policy: @trivia_policy,
    kinds: kinds, slots: (named).freeze
  }.freeze #: metadata
  
end