Class: Ibex::Codegen::CSTMetadata
- Inherits:
-
Object
- Object
- Ibex::Codegen::CSTMetadata
- 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
-
#build ⇒ Object
Return table-ready CST metadata with stable insertion order.
-
#initialize(grammar, trivia_policy: :leading) ⇒ CSTMetadata
constructor
A new instance of CSTMetadata.
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
#build ⇒ Object
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 |