Module: Ibex::NormalizeParameterLowering
- Included in:
- Normalizer
- Defined in:
- lib/ibex/normalize/parameter_lowering.rb,
sig/ibex/normalize/parameter_lowering.rbs
Overview
Resumable, source-ordered lowering for specialized parameter alternatives.
Instance Method Summary collapse
- #advance_parameter_alternative(frame) ⇒ void
- #finish_parameter_alternative(frame) ⇒ void
- #finish_parameter_item(frame, item) ⇒ void
- #lower_parameter_call(frame, item) ⇒ void
- #lower_parameter_item(frame, item) ⇒ void
- #parameter_items_remaining?(frame) ⇒ Boolean
- #process_parameter_operation(frame, operation) ⇒ void
- #start_parameter_item(frame) ⇒ void
- #with_parameter_frame_context(frame) { ... } ⇒ void
Instance Method Details
#advance_parameter_alternative(frame) ⇒ void
This method returns an undefined value.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 9 def advance_parameter_alternative(frame) # @type self: Normalizer with_parameter_frame_context(frame) do operations = frame.fetch(:operations) if operations.any? operation = operations.pop #: NormalizeParameters::parameter_operation process_parameter_operation(frame, operation) elsif parameter_items_remaining?(frame) start_parameter_item(frame) else finish_parameter_alternative(frame) end end end |
#finish_parameter_alternative(frame) ⇒ void
This method returns an undefined value.
132 133 134 135 136 137 138 139 140 141 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 132 def finish_parameter_alternative(frame) # @type self: Normalizer _template, rule, alternative = frame.fetch(:current) || raise(Ibex::Error, "missing parameter alternative") action = normalize_action(alternative.action, frame.fetch(:named_refs)) add_production( rule.lhs, frame.fetch(:rhs), action, alternative.precedence, { kind: :user, loc: alternative.loc.to_h }, rule.documentation ) clear_parameter_alternative(frame) end |
#finish_parameter_item(frame, item) ⇒ void
This method returns an undefined value.
124 125 126 127 128 129 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 124 def finish_parameter_item(frame, item) # @type self: Normalizer rhs = frame.fetch(:rhs) rhs << (frame.fetch(:values).pop || raise(Ibex::Error, "missing parameter value")) add_named_reference(item, frame.fetch(:named_refs), rhs.length - 1) end |
#lower_parameter_call(frame, item) ⇒ void
This method returns an undefined value.
117 118 119 120 121 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 117 def lower_parameter_call(frame, item) # @type self: Normalizer helper, = schedule_parameter_specialization(item) frame.fetch(:values) << helper end |
#lower_parameter_item(frame, item) ⇒ void
This method returns an undefined value.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 98 def lower_parameter_item(frame, item) # @type self: Normalizer case item when Frontend::AST::SymbolReference frame.fetch(:values) << symbol_for_reference(item).name when Frontend::AST::ParameterizedReference lower_parameter_call(frame, item) when Frontend::AST::Group lower_parameter_group(frame, item) when Frontend::AST::Optional, Frontend::AST::Star, Frontend::AST::Plus lower_parameter_suffix(frame, item) when Frontend::AST::SeparatedList lower_parameter_separated_list(frame, item) else fail_at(item.loc, "unsupported nested EBNF expression") end end |
#parameter_items_remaining?(frame) ⇒ Boolean
42 43 44 45 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 42 def parameter_items_remaining?(frame) _template, _rule, alternative = frame.fetch(:current) || raise(Ibex::Error, "missing parameter alternative") frame.fetch(:item_index) < alternative.items.length end |
#process_parameter_operation(frame, operation) ⇒ void
This method returns an undefined value.
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 64 def process_parameter_operation(frame, operation) # @type self: Normalizer kind = operation.fetch(0) #: Symbol case kind when :item item = operation.fetch(1) #: Frontend::AST::item lower_parameter_item(frame, item) when :finish_item item = operation.fetch(1) #: Frontend::AST::item finish_parameter_item(frame, item) when :value value = operation.fetch(1) #: String frame.fetch(:values) << value when :finish_suffix item = operation.fetch(1) #: Frontend::AST::Optional | Frontend::AST::Star | Frontend::AST::Plus finish_parameter_suffix(frame, item) when :finish_separated item = operation.fetch(1) #: Frontend::AST::SeparatedList finish_parameter_separated_list(frame, item) when :group_alternative helper = operation.fetch(1) #: String item = operation.fetch(2) #: Frontend::AST::Group alternative = operation.fetch(3) #: Array[Frontend::AST::item] start_parameter_group_alternative(frame, helper, item, alternative) when :finish_group_alternative helper = operation.fetch(1) #: String item = operation.fetch(2) #: Frontend::AST::Group length = operation.fetch(3) #: Integer finish_parameter_group_alternative(frame, helper, item, length) else raise Ibex::Error, "internal parameter lowering operation #{kind.inspect}" end end |
#start_parameter_item(frame) ⇒ void
This method returns an undefined value.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 48 def start_parameter_item(frame) # @type self: Normalizer _template, _rule, alternative = frame.fetch(:current) || raise(Ibex::Error, "missing parameter alternative") index = frame.fetch(:item_index) item = alternative.items.fetch(index) frame[:item_index] = index + 1 if item.is_a?(Frontend::AST::InlineAction) frame.fetch(:rhs) << ( item, frame.fetch(:rhs).length, frame.fetch(:named_refs) ) else frame.fetch(:operations).push([:finish_item, item], [:item, item]) end end |
#with_parameter_frame_context(frame) { ... } ⇒ void
This method returns an undefined value.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/ibex/normalize/parameter_lowering.rb', line 25 def with_parameter_frame_context(frame) # @type self: Normalizer template, = frame.fetch(:current) || raise(Ibex::Error, "missing parameter alternative") previous_chain = @current_include_chain previous_expansion = @current_parameter_expansion reference = frame.fetch(:reference) @current_include_chain = @resolution&.include_chain_for(template) || [] @current_parameter_expansion = { rule: reference.name, arguments: frame.fetch(:rendered_arguments) } yield ensure @current_include_chain = previous_chain @current_parameter_expansion = previous_expansion end |