Module: Ibex::NormalizeParameterSubstitution
- Included in:
- Normalizer
- Defined in:
- lib/ibex/normalize/parameter_substitution.rb,
sig/ibex/normalize/parameter_substitution.rbs
Overview
Structural, sharing-preserving substitution for parameterized user rules.
Instance Method Summary collapse
- #clone_parameter_call(item, bindings) ⇒ Frontend::AST::ParameterizedReference
- #clone_parameter_group(item, bindings) ⇒ Frontend::AST::Group
- #clone_parameter_item(item, bindings = {}) ⇒ Frontend::AST::item
- #clone_parameter_separated_list(item, bindings) ⇒ Frontend::AST::SeparatedList
- #clone_parameter_suffix(item, bindings) ⇒ Frontend::AST::item
- #clone_parameter_symbol(item, bindings) ⇒ Frontend::AST::item
- #substitute_formal_reference(formal, argument) ⇒ Frontend::AST::item
- #substitute_parameter_alternative(alternative, bindings) ⇒ Frontend::AST::Alternative
- #substitute_parameter_item(item, bindings) ⇒ Frontend::AST::item
- #substitute_parameter_precedence(alternative, bindings) ⇒ String?
Instance Method Details
#clone_parameter_call(item, bindings) ⇒ Frontend::AST::ParameterizedReference
89 90 91 92 93 94 95 96 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 89 def clone_parameter_call(item, bindings) # @type self: Normalizer fail_at(item.loc, "formal #{item.name} cannot be used as a parameterized rule name") if bindings.key?(item.name) Frontend::AST::ParameterizedReference.new( name: item.name, arguments: item.arguments.map { |argument| substitute_parameter_item(argument, bindings) }, named_reference: item.named_reference, loc: item.loc ) end |
#clone_parameter_group(item, bindings) ⇒ Frontend::AST::Group
99 100 101 102 103 104 105 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 99 def clone_parameter_group(item, bindings) # @type self: Normalizer alternatives = item.alternatives.map do |items| items.map { |child| substitute_parameter_item(child, bindings) } end Frontend::AST::Group.new(alternatives: alternatives, loc: item.loc) end |
#clone_parameter_item(item, bindings = {}) ⇒ Frontend::AST::item
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 61 def clone_parameter_item(item, bindings = {}) # @type self: Normalizer case item when Frontend::AST::SymbolReference clone_parameter_symbol(item, bindings) when Frontend::AST::ParameterizedReference clone_parameter_call(item, bindings) when Frontend::AST::Group clone_parameter_group(item, bindings) when Frontend::AST::Optional, Frontend::AST::Star, Frontend::AST::Plus clone_parameter_suffix(item, bindings) when Frontend::AST::SeparatedList clone_parameter_separated_list(item, bindings) else item end end |
#clone_parameter_separated_list(item, bindings) ⇒ Frontend::AST::SeparatedList
116 117 118 119 120 121 122 123 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 116 def clone_parameter_separated_list(item, bindings) # @type self: Normalizer Frontend::AST::SeparatedList.new( item: substitute_parameter_item(item.item, bindings), separator: substitute_parameter_item(item.separator, bindings), nonempty: item.nonempty, loc: item.loc ) end |
#clone_parameter_suffix(item, bindings) ⇒ Frontend::AST::item
109 110 111 112 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 109 def clone_parameter_suffix(item, bindings) # @type self: Normalizer item.class.new(item: substitute_parameter_item(item.item, bindings), loc: item.loc) end |
#clone_parameter_symbol(item, bindings) ⇒ Frontend::AST::item
80 81 82 83 84 85 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 80 def clone_parameter_symbol(item, bindings) # @type self: Normalizer return substitute_parameter_item(item, bindings) if bindings.key?(item.name) Frontend::AST::SymbolReference.new(name: item.name, named_reference: item.named_reference, loc: item.loc) end |
#substitute_formal_reference(formal, argument) ⇒ Frontend::AST::item
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 43 def substitute_formal_reference(formal, argument) # @type self: Normalizer name = formal.named_reference return argument unless name case argument when Frontend::AST::SymbolReference Frontend::AST::SymbolReference.new(name: argument.name, named_reference: name, loc: argument.loc) when Frontend::AST::ParameterizedReference Frontend::AST::ParameterizedReference.new( name: argument.name, arguments: argument.arguments, named_reference: name, loc: argument.loc ) else fail_at(formal.loc, "named formal #{formal.name} requires a plain symbol or parameterized argument") end end |
#substitute_parameter_alternative(alternative, bindings) ⇒ Frontend::AST::Alternative
10 11 12 13 14 15 16 17 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 10 def substitute_parameter_alternative(alternative, bindings) # @type self: Normalizer Frontend::AST::Alternative.new( items: alternative.items.map { |item| substitute_parameter_item(item, bindings) }, action: alternative.action, precedence: substitute_parameter_precedence(alternative, bindings), node_annotation: alternative.node_annotation, loc: alternative.loc ) end |
#substitute_parameter_item(item, bindings) ⇒ Frontend::AST::item
33 34 35 36 37 38 39 40 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 33 def substitute_parameter_item(item, bindings) # @type self: Normalizer if item.is_a?(Frontend::AST::SymbolReference) && bindings.key?(item.name) return substitute_formal_reference(item, bindings.fetch(item.name)) end clone_parameter_item(item, bindings) end |
#substitute_parameter_precedence(alternative, bindings) ⇒ String?
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/ibex/normalize/parameter_substitution.rb', line 20 def substitute_parameter_precedence(alternative, bindings) # @type self: Normalizer precedence = alternative.precedence return precedence unless precedence && bindings.key?(precedence) argument = bindings.fetch(precedence) unless argument.is_a?(Frontend::AST::SymbolReference) && !argument.named_reference fail_at(alternative.loc, "formal precedence #{precedence} requires one plain symbol argument") end argument.name end |