Sha256: fa64f3f4e4425f607ca769507f19b53205d3d4cc646658d729cacf73e7cc5e85

Contents?: true

Size: 991 Bytes

Versions: 2

Compression:

Stored size: 991 Bytes

Contents

# frozen_string_literal: true

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) || symbol
        end
      end

      private

      def parameter_to_arg(symbol)
        if (arg = @parameter_to_arg[symbol.s_value].dup)
          arg.alias_name = symbol.alias_name
        end
        arg
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lrama-0.6.11 lib/lrama/grammar/binding.rb
lrama-0.6.10 lib/lrama/grammar/binding.rb