@@ -256,7 +256,9 @@ def epilogue=(epilogue)
256256
257257 # @rbs () -> void
258258 def prepare
259- unless @no_inline
259+ if @no_inline
260+ convert_inline_rules_to_regular_rules
261+ else
260262 validate_inline_rules
261263 resolve_inline_rules
262264 end
@@ -462,6 +464,40 @@ def resolve_inline_rules
462464 end
463465 end
464466
467+ # Convert inline rules to regular rules when --no-inline is specified.
468+ # This allows inline rules to be treated as ordinary non-terminal rules.
469+ # Only non-parameterized inline rules can be converted (rules with parameters
470+ # require instantiation and cannot be converted to simple rules).
471+ #
472+ # @rbs () -> void
473+ def convert_inline_rules_to_regular_rules
474+ inline_rules = @parameterized_resolver . rules . select { |rule | rule . inline? && rule . required_parameters_count == 0 }
475+ return if inline_rules . empty?
476+
477+ converted_names = Set . new #: Set[String]
478+
479+ inline_rules . each do |inline_rule |
480+ lhs_token = Lexer ::Token ::Ident . new ( s_value : inline_rule . name )
481+ converted_names << inline_rule . name
482+
483+ inline_rule . rhs . each do |rhs |
484+ rule_builder = RuleBuilder . new ( @rule_counter , @midrule_action_counter , @parameterized_resolver , lhs_tag : inline_rule . tag )
485+ rule_builder . lhs = lhs_token
486+ rhs . symbols . each { |sym | rule_builder . add_rhs ( sym ) }
487+ rule_builder . precedence_sym = rhs . precedence_sym
488+ rule_builder . user_code = rhs . user_code
489+ rule_builder . complete_input
490+ @rule_builders << rule_builder
491+ end
492+ end
493+
494+ # Remove converted inline rules from the resolver so that find_inline
495+ # won't find them, allowing rules that reference them to be built normally
496+ @parameterized_resolver . rules = @parameterized_resolver . rules . reject do |rule |
497+ rule . inline? && converted_names . include? ( rule . name )
498+ end
499+ end
500+
465501 # @rbs () -> void
466502 def normalize_rules
467503 add_accept_rule
0 commit comments