summaryrefslogtreecommitdiff
path: root/tool/lrama/lib/lrama/grammar/binding.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tool/lrama/lib/lrama/grammar/binding.rb')
-rw-r--r--tool/lrama/lib/lrama/grammar/binding.rb24
1 files changed, 24 insertions, 0 deletions
diff --git a/tool/lrama/lib/lrama/grammar/binding.rb b/tool/lrama/lib/lrama/grammar/binding.rb
new file mode 100644
index 0000000000..e5ea3fb037
--- /dev/null
+++ b/tool/lrama/lib/lrama/grammar/binding.rb
@@ -0,0 +1,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