From b6c3170211be57e07bc1f5b3de85fa87a1858300 Mon Sep 17 00:00:00 2001 From: ydah Date: Thu, 2 May 2024 17:39:24 +0900 Subject: [PATCH] Add support for aliased Named References for actions of rhs in Parameterizing rules --- lib/lrama/grammar/binding.rb | 11 ++++++++++- sig/lrama/grammar/binding.rbs | 4 ++++ .../user_defined/with_action_and_named_references.y | 2 +- spec/lrama/parser_spec.rb | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/lrama/grammar/binding.rb b/lib/lrama/grammar/binding.rb index e5ea3fb0..21b6ad5b 100644 --- a/lib/lrama/grammar/binding.rb +++ b/lib/lrama/grammar/binding.rb @@ -16,9 +16,18 @@ def resolve_symbol(symbol) 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 + 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 diff --git a/sig/lrama/grammar/binding.rbs b/sig/lrama/grammar/binding.rbs index 817d7eb1..3d6b1a6c 100644 --- a/sig/lrama/grammar/binding.rbs +++ b/sig/lrama/grammar/binding.rbs @@ -10,6 +10,10 @@ module Lrama def initialize: (Grammar::ParameterizingRule::Rule parameterizing_rule, Array[Lexer::Token] actual_args) -> void def resolve_symbol: (Lexer::Token symbol) -> Lexer::Token + + private + + def parameter_to_arg: (Lexer::Token symbol) -> Lexer::Token? end end end diff --git a/spec/fixtures/parameterizing_rules/user_defined/with_action_and_named_references.y b/spec/fixtures/parameterizing_rules/user_defined/with_action_and_named_references.y index 85ae0d5c..9bb96b66 100644 --- a/spec/fixtures/parameterizing_rules/user_defined/with_action_and_named_references.y +++ b/spec/fixtures/parameterizing_rules/user_defined/with_action_and_named_references.y @@ -16,7 +16,7 @@ static int yyerror(YYLTYPE *loc, const char *str); %token number %token string -%rule pair(X, Y): X ',' Y { printf("(%d, %d)\n", $X, $3); } +%rule pair(X, Y): X ',' Y[alias] { printf("(%d, %d)\n", $X, $alias); } ; %% diff --git a/spec/lrama/parser_spec.rb b/spec/lrama/parser_spec.rb index 2fddc68b..85627a57 100644 --- a/spec/lrama/parser_spec.rb +++ b/spec/lrama/parser_spec.rb @@ -1719,7 +1719,7 @@ grammar.find_symbol_by_s_value!("string") ], lhs_tag: nil, - token_code: T::UserCode.new(s_value: " printf(\"(%d, %d)\\n\", $X, $3); "), + token_code: T::UserCode.new(s_value: " printf(\"(%d, %d)\\n\", $X, $alias); "), nullable: false, precedence_sym: grammar.find_symbol_by_s_value!("string"), lineno: 24,