Skip to content

Commit

Permalink
Lrama v0.6.9
Browse files Browse the repository at this point in the history
  • Loading branch information
yui-knk committed May 2, 2024
1 parent d22dfce commit d8216aa
Show file tree
Hide file tree
Showing 5 changed files with 150 additions and 127 deletions.
22 changes: 22 additions & 0 deletions tool/lrama/lib/lrama/grammar/parameterizing_rule/rhs.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,28 @@ def initialize
@user_code = nil
@precedence_sym = nil
end

def resolve_user_code(bindings)
return unless user_code

var_to_arg = {}
symbols.each do |sym|
resolved_sym = bindings.resolve_symbol(sym)
if resolved_sym != sym
var_to_arg[sym.s_value] = resolved_sym.s_value
end
end

var_to_arg.each do |var, arg|
user_code.references.each do |ref|
if ref.name == var
ref.name = arg
end
end
end

return user_code
end
end
end
end
Expand Down
5 changes: 3 additions & 2 deletions tool/lrama/lib/lrama/grammar/parameterizing_rule/rule.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,13 @@ module Lrama
class Grammar
class ParameterizingRule
class Rule
attr_reader :name, :parameters, :rhs_list, :required_parameters_count, :is_inline
attr_reader :name, :parameters, :rhs_list, :required_parameters_count, :tag, :is_inline

def initialize(name, parameters, rhs_list, is_inline: false)
def initialize(name, parameters, rhs_list, tag: nil, is_inline: false)
@name = name
@parameters = parameters
@rhs_list = rhs_list
@tag = tag
@is_inline = is_inline
@required_parameters_count = parameters.count
end
Expand Down
4 changes: 2 additions & 2 deletions tool/lrama/lib/lrama/grammar/rule_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -130,12 +130,12 @@ def process_rhs(parameterizing_rule_resolver)
@replaced_rhs << lhs_token
parameterizing_rule_resolver.created_lhs_list << lhs_token
parameterizing_rule.rhs_list.each do |r|
rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, lhs_tag: token.lhs_tag)
rule_builder = RuleBuilder.new(@rule_counter, @midrule_action_counter, lhs_tag: token.lhs_tag || parameterizing_rule.tag)
rule_builder.lhs = lhs_token
r.symbols.each { |sym| rule_builder.add_rhs(bindings.resolve_symbol(sym)) }
rule_builder.line = line
rule_builder.precedence_sym = r.precedence_sym
rule_builder.user_code = r.user_code
rule_builder.user_code = r.resolve_user_code(bindings)
rule_builder.complete_input
rule_builder.setup_rules(parameterizing_rule_resolver)
@rule_builders_for_parameterizing_rules << rule_builder
Expand Down
Loading

0 comments on commit d8216aa

Please sign in to comment.