summaryrefslogtreecommitdiff
path: root/tool/lrama/lib/lrama/grammar/binding.rb
blob: e5ea3fb037c21b232ba19bf9d7c7fcaa50dd4db2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
module Lrama
  class Grammar
    class Binding
      attr_reader :actual_args, :count

      def initialize(parameterizing_rule, actual_args)
        @parameters = parameterizing_rule.parameters
        @actual_args = actual_args
        @parameter_to_arg = @parameters.zip(actual_args).map do |param, arg|
          [param.s_value, arg]
        end.to_h
      end

      def resolve_symbol(symbol)
        if symbol.is_a?(Lexer::Token::InstantiateRule)
          resolved_args = symbol.args.map { |arg| resolve_symbol(arg) }
          Lrama::Lexer::Token::InstantiateRule.new(s_value: symbol.s_value, location: symbol.location, args: resolved_args, lhs_tag: symbol.lhs_tag)
        else
          @parameter_to_arg[symbol.s_value] || symbol
        end
      end
    end
  end
end