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

Instance Method Details

#clone_parameter_call(item, bindings) ⇒ Frontend::AST::ParameterizedReference

RBS:

  • (Frontend::AST::ParameterizedReference item, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::ParameterizedReference

Parameters:

Returns:



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

RBS:

  • (Frontend::AST::Group item, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::Group

Parameters:

Returns:



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

RBS:

  • (Frontend::AST::item item, ?Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::item

Parameters:

  • item (Frontend::AST::item)
  • bindings (Hash[String, Frontend::AST::item]) (defaults to: {})

Returns:

  • (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

RBS:

  • (Frontend::AST::SeparatedList item, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::SeparatedList

Parameters:

Returns:



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

RBS:

  • (Frontend::AST::Optional | Frontend::AST::Star | Frontend::AST::Plus item, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::item

Parameters:

Returns:

  • (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

RBS:

  • (Frontend::AST::SymbolReference item, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::item

Parameters:

Returns:

  • (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

RBS:

  • (Frontend::AST::SymbolReference formal, Frontend::AST::item argument) -> Frontend::AST::item

Parameters:

Returns:

  • (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

RBS:

  • (Frontend::AST::Alternative alternative, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::Alternative

Parameters:

Returns:



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

RBS:

  • (Frontend::AST::item item, Hash[String, Frontend::AST::item] bindings) -> Frontend::AST::item

Parameters:

  • item (Frontend::AST::item)
  • bindings (Hash[String, Frontend::AST::item])

Returns:

  • (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?

RBS:

  • (Frontend::AST::Alternative alternative, Hash[String, Frontend::AST::item] bindings) -> String?

Parameters:

Returns:

  • (String, nil)


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