From 87890a3d77dce218c46a9e4a0711d60b279749b7 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 9 Feb 2026 16:52:15 -0500 Subject: [PATCH] Add p_result_*() and p_free_ast_*() functions for each start node --- assets/parser.c.erb | 31 ++++++++++++++++++++++++++----- assets/parser.d.erb | 21 ++++++++++++++++----- assets/parser.h.erb | 15 +++++++++++++-- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/assets/parser.c.erb b/assets/parser.c.erb index cae1f92..220d398 100644 --- a/assets/parser.c.erb +++ b/assets/parser.c.erb @@ -1111,16 +1111,27 @@ size_t <%= @grammar.prefix %>parse(<%= @grammar.prefix %>context_t * context) */ <% if @grammar.ast %> <%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> * <%= @grammar.prefix %>result(<%= @grammar.prefix %>context_t * context) +{ + return (<%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> *) context->parse_result; +} +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +<%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> * <%= @grammar.prefix %>result_<%= start_rule %>(<%= @grammar.prefix %>context_t * context) +{ + return (<%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> *) context->parse_result; +} +<% end %> <% else %> <%= start_rule_type[1] %> <%= @grammar.prefix %>result(<%= @grammar.prefix %>context_t * context) -<% end %> { -<% if @grammar.ast %> - return (<%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> *) context->parse_result; -<% else %> return context->parse_result.v_<%= start_rule_type[0] %>; -<% end %> } +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +<%= start_rule_type(i)[1] %> <%= @grammar.prefix %>result_<%= start_rule %>(<%= @grammar.prefix %>context_t * context) +{ + return context->parse_result.v_<%= start_rule_type(i)[0] %>; +} +<% end %> +<% end %> /** * Get the current text input position. @@ -1188,4 +1199,14 @@ void <%= @grammar.prefix %>free_ast(<%= @grammar.ast_prefix %><%= @grammar.start { free_ast_node((ASTNode *)ast); } +<% @grammar.start_rules.each_with_index do |start_rule, i| %> + +/** + * Free all AST node memory. + */ +void <%= @grammar.prefix %>free_ast_<%= start_rule %>(<%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> * ast) +{ + free_ast_node((ASTNode *)ast); +} +<% end %> <% end %> diff --git a/assets/parser.d.erb b/assets/parser.d.erb index b3d1a0f..213c3be 100644 --- a/assets/parser.d.erb +++ b/assets/parser.d.erb @@ -1157,16 +1157,27 @@ public size_t <%= @grammar.prefix %>parse(<%= @grammar.prefix %>context_t * cont */ <% if @grammar.ast %> public <%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> * <%= @grammar.prefix %>result(<%= @grammar.prefix %>context_t * context) +{ + return cast(<%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> *)context.parse_result; +} +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +public <%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> * <%= @grammar.prefix %>result_<%= start_rule %>(<%= @grammar.prefix %>context_t * context) +{ + return cast(<%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> *)context.parse_result; +} +<% end %> <% else %> public <%= start_rule_type[1] %> <%= @grammar.prefix %>result(<%= @grammar.prefix %>context_t * context) -<% end %> { -<% if @grammar.ast %> - return cast(<%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> *)context.parse_result; -<% else %> return context.parse_result.v_<%= start_rule_type[0] %>; -<% end %> } +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +public <%= start_rule_type(i)[1] %> <%= @grammar.prefix %>result_<%= start_rule %>(<%= @grammar.prefix %>context_t * context) +{ + return context.parse_result.v_<%= start_rule_type(i)[0] %>; +} +<% end %> +<% end %> /** * Get the current text input position. diff --git a/assets/parser.h.erb b/assets/parser.h.erb index b88841d..3d36efe 100644 --- a/assets/parser.h.erb +++ b/assets/parser.h.erb @@ -192,10 +192,21 @@ size_t <%= @grammar.prefix %>parse(<%= @grammar.prefix %>context_t * context); <% if @grammar.ast %> <%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> * <%= @grammar.prefix %>result(<%= @grammar.prefix %>context_t * context); - -void <%= @grammar.prefix %>free_ast(<%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> * ast); +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +<%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> * <%= @grammar.prefix %>result_<%= start_rule %>(<%= @grammar.prefix %>context_t * context); +<% end %> <% else %> <%= start_rule_type[1] %> <%= @grammar.prefix %>result(<%= @grammar.prefix %>context_t * context); +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +<%= start_rule_type(i)[1] %> <%= @grammar.prefix %>result_<%= start_rule %>(<%= @grammar.prefix %>context_t * context); +<% end %> +<% end %> + +<% if @grammar.ast %> +void <%= @grammar.prefix %>free_ast(<%= @grammar.ast_prefix %><%= @grammar.start_rules[0] %><%= @grammar.ast_suffix %> * ast); +<% @grammar.start_rules.each_with_index do |start_rule, i| %> +void <%= @grammar.prefix %>free_ast_<%= start_rule %>(<%= @grammar.ast_prefix %><%= start_rule %><%= @grammar.ast_suffix %> * ast); +<% end %> <% end %> <%= @grammar.prefix %>position_t <%= @grammar.prefix %>position(<%= @grammar.prefix %>context_t * context);