diff options
Diffstat (limited to 'tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb')
-rw-r--r-- | tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb b/tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb index 28c9ad427d..20950b9b36 100644 --- a/tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb +++ b/tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb @@ -8,6 +8,7 @@ require 'lrama/grammar/parameterizing_rules/builder/separated_list' module Lrama class Grammar class ParameterizingRules + # Builder for parameterizing rules class Builder RULES = { option: Lrama::Grammar::ParameterizingRules::Builder::Option, @@ -20,23 +21,39 @@ module Lrama separated_list: Lrama::Grammar::ParameterizingRules::Builder::SeparatedList, } - def initialize(token, rule_counter, lhs, user_code, precedence_sym, line) + def initialize(token, rule_counter, lhs_tag, user_code, precedence_sym, line) @token = token @key = token.s_value.to_sym @rule_counter = rule_counter - @lhs = lhs + @lhs_tag = lhs_tag @user_code = user_code @precedence_sym = precedence_sym @line = line + @builder = nil end def build - if RULES.key?(@key) - RULES[@key].new(@token, @rule_counter, @lhs, @user_code, @precedence_sym, @line).build - else - raise "Parameterizing rule does not exist. `#{@key}`" + create_builder + @builder.build + end + + def build_token + create_builder + @builder.build_token + end + + private + + def create_builder + unless @builder + validate_key! + @builder = RULES[@key].new(@token, @rule_counter, @lhs_tag, @user_code, @precedence_sym, @line) end end + + def validate_key! + raise "Parameterizing rule does not exist. `#{@key}`" unless RULES.key?(@key) + end end end end |