aboutsummaryrefslogtreecommitdiffstats
path: root/tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb')
-rw-r--r--tool/lrama/lib/lrama/grammar/parameterizing_rules/builder.rb29
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