Class: Ibex::IR::Grammar

Inherits:
Object
  • Object
show all
Defined in:
lib/ibex/ir/grammar_ir.rb

Overview

Immutable normalized grammar exchanged between pipeline stages.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(class_name:, superclass:, start:, expect:, options:, symbols:, productions:, user_code:, conversions:, warnings:, user_code_chunks: nil, schema_version: SCHEMA_VERSION, source_provenance: nil, migration: nil, expect_rr: nil, parser_parameters: [], value_printers: [], grammar_tests: [], recovery: nil, lexer: nil, mode: :default, starts: nil) ⇒ Grammar

rubocop:disable Metrics/AbcSize, Metrics/ParameterLists Immutable versioned IR is constructed from explicit public fields.



190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
# File 'lib/ibex/ir/grammar_ir.rb', line 190

def initialize(class_name:, superclass:, start:, expect:, options:, symbols:, productions:, user_code:,
               conversions:, warnings:, user_code_chunks: nil, schema_version: SCHEMA_VERSION,
               source_provenance: nil, migration: nil, expect_rr: nil, parser_parameters: [], value_printers: [],
               grammar_tests: [], recovery: nil, lexer: nil, mode: :default, starts: nil)
  validate_mode(mode)
  normalized_starts = validate_starts(start, starts, mode)

  @class_name = class_name.freeze
  @superclass = superclass&.freeze
  @start = start.freeze
  @starts = normalized_starts.map(&:freeze).freeze
  @mode = mode
  @expect = expect
  @expect_rr = expect_rr
  @parser_parameters = IR.deep_freeze(parser_parameters)
  @value_printers = IR.deep_freeze(value_printers)
  @grammar_tests = IR.deep_freeze(grammar_tests)
  @lexer = lexer
  @recovery = IR.deep_freeze(recovery || { sync_tokens: [], on_error_reduce: [] })
  @options = IR.deep_freeze(options)
  @symbols = symbols.freeze
  @productions = productions.freeze
  @user_code = IR.deep_freeze(user_code)
  @user_code_chunks = IR.deep_freeze(user_code_chunks || {})
  validate_user_code_chunks
  @conversions = IR.deep_freeze(conversions)
  @warnings = IR.deep_freeze(warnings)
  @schema_version = schema_version
  @source_provenance = IR.deep_freeze(source_provenance)
  @migration = IR.deep_freeze(migration)
  @symbols_by_name = @symbols.to_h { |symbol| [symbol.name, symbol] }.freeze
  @symbols_by_id = @symbols.to_h { |symbol| [symbol.id, symbol] }.freeze
  freeze
end

Instance Attribute Details

#class_nameObject (readonly)

: String



156
157
158
# File 'lib/ibex/ir/grammar_ir.rb', line 156

def class_name
  @class_name
end

#conversionsObject (readonly)

: Hash[String, String]



173
174
175
# File 'lib/ibex/ir/grammar_ir.rb', line 173

def conversions
  @conversions
end

#expectObject (readonly)

: Integer



161
162
163
# File 'lib/ibex/ir/grammar_ir.rb', line 161

def expect
  @expect
end

#expect_rrObject (readonly)

: Integer?



162
163
164
# File 'lib/ibex/ir/grammar_ir.rb', line 162

def expect_rr
  @expect_rr
end

#grammar_testsObject (readonly)

: Array



165
166
167
# File 'lib/ibex/ir/grammar_ir.rb', line 165

def grammar_tests
  @grammar_tests
end

#lexerObject (readonly)

: Lexer?



166
167
168
# File 'lib/ibex/ir/grammar_ir.rb', line 166

def lexer
  @lexer
end

#migrationObject (readonly)

: migration_metadata?



177
178
179
# File 'lib/ibex/ir/grammar_ir.rb', line 177

def migration
  @migration
end

#modeObject (readonly)

: grammar_mode



160
161
162
# File 'lib/ibex/ir/grammar_ir.rb', line 160

def mode
  @mode
end

#optionsObject (readonly)

: grammar_options



168
169
170
# File 'lib/ibex/ir/grammar_ir.rb', line 168

def options
  @options
end

#parser_parametersObject (readonly)

: Array



163
164
165
# File 'lib/ibex/ir/grammar_ir.rb', line 163

def parser_parameters
  @parser_parameters
end

#productionsObject (readonly)

: Array



170
171
172
# File 'lib/ibex/ir/grammar_ir.rb', line 170

def productions
  @productions
end

#recoveryObject (readonly)

: recovery_policy



167
168
169
# File 'lib/ibex/ir/grammar_ir.rb', line 167

def recovery
  @recovery
end

#schema_versionObject (readonly)

: Integer



175
176
177
# File 'lib/ibex/ir/grammar_ir.rb', line 175

def schema_version
  @schema_version
end

#source_provenanceObject (readonly)

: source_provenance?



176
177
178
# File 'lib/ibex/ir/grammar_ir.rb', line 176

def source_provenance
  @source_provenance
end

#startObject (readonly)

: String



158
159
160
# File 'lib/ibex/ir/grammar_ir.rb', line 158

def start
  @start
end

#startsObject (readonly)

: Array



159
160
161
# File 'lib/ibex/ir/grammar_ir.rb', line 159

def starts
  @starts
end

#superclassObject (readonly)

: String?



157
158
159
# File 'lib/ibex/ir/grammar_ir.rb', line 157

def superclass
  @superclass
end

#symbolsObject (readonly)

: Array



169
170
171
# File 'lib/ibex/ir/grammar_ir.rb', line 169

def symbols
  @symbols
end

#user_codeObject (readonly)

: Hash[String, String]



171
172
173
# File 'lib/ibex/ir/grammar_ir.rb', line 171

def user_code
  @user_code
end

#user_code_chunksObject (readonly)

: user_code_chunks



172
173
174
# File 'lib/ibex/ir/grammar_ir.rb', line 172

def user_code_chunks
  @user_code_chunks
end

#value_printersObject (readonly)

: Array



164
165
166
# File 'lib/ibex/ir/grammar_ir.rb', line 164

def value_printers
  @value_printers
end

#warningsObject (readonly)

: Array



174
175
176
# File 'lib/ibex/ir/grammar_ir.rb', line 174

def warnings
  @warnings
end

Instance Method Details

#nonterminalsObject



233
# File 'lib/ibex/ir/grammar_ir.rb', line 233

def nonterminals = @symbols.select(&:nonterminal?)

#symbol(name) ⇒ Object



227
228
# File 'lib/ibex/ir/grammar_ir.rb', line 227

def symbol(name) = @symbols_by_name[name]
# @rbs (Integer? id) -> GrammarSymbol?

#symbol_by_id(id) ⇒ Object



229
230
# File 'lib/ibex/ir/grammar_ir.rb', line 229

def symbol_by_id(id) = @symbols_by_id[id]
# @rbs () -> Array[GrammarSymbol]

#terminalsObject



231
232
# File 'lib/ibex/ir/grammar_ir.rb', line 231

def terminals = @symbols.select(&:terminal?)
# @rbs () -> Array[GrammarSymbol]

#to_hObject



236
237
238
239
240
241
242
243
244
245
# File 'lib/ibex/ir/grammar_ir.rb', line 236

def to_h
  value = { ibex_ir: "grammar", schema_version: @schema_version, class_name: @class_name, superclass: @superclass,
            start: @start, expect: @expect, options: @options,
            symbols: @symbols.map { |symbol| symbol.to_h(schema_version: @schema_version) },
            productions: @productions.map { |production| production.to_h(schema_version: @schema_version) },
            user_code: @user_code, conversions: @conversions,
            warnings: @warnings } #: Hash[Symbol, untyped]
  (value)
  value
end