From 839174a63534a92ee27ec8763c229a1fab84202e Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 4 Apr 2025 15:24:07 -0400 Subject: [PATCH] Generate comments to annotate reduce table entries --- assets/parser.c.erb | 17 +++++++++++------ assets/parser.d.erb | 17 +++++++++++------ lib/propane/parser.rb | 2 +- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/assets/parser.c.erb b/assets/parser.c.erb index ed22631..f95ac75 100644 --- a/assets/parser.c.erb +++ b/assets/parser.c.erb @@ -712,17 +712,22 @@ const uint16_t r_<%= rule.name.gsub("$", "_") %><%= rule.id %>_node_field_index_ /** Parser reduce table. */ static const reduce_t parser_reduce_table[] = { <% @parser.reduce_table.each do |reduce| %> - {<%= reduce[:token_id] %>u, <%= reduce[:rule_id] %>u, <%= reduce[:rule_set_id] %>u, <%= reduce[:n_states] %>u + { + <%= reduce[:token_id] %>u, /* Token: <%= reduce[:token] ? reduce[:token].name : "(any)" %> */ + <%= reduce[:rule_id] %>u, /* Rule ID */ + <%= reduce[:rule_set_id] %>u, /* Rule set ID (<%= reduce[:rule].rule_set.name %>) */ <% if @grammar.ast %> + <%= reduce[:n_states] %>u, /* Number of states */ <% if reduce[:rule].flat_rule_set_node_field_index_map? %> - , NULL + NULL, /* No rule set node field index map (flat map) */ <% else %> - , &r_<%= reduce[:rule].name.gsub("$", "_") %><%= reduce[:rule].id %>_node_field_index_map[0] + &r_<%= reduce[:rule].name.gsub("$", "_") %><%= reduce[:rule].id %>_node_field_index_map[0], /* Rule set node field index map */ <% end %> - , <%= reduce[:rule].rule_set.ast_fields.size %> - , <%= reduce[:propagate_optional_target] %> + <%= reduce[:rule].rule_set.ast_fields.size %>, /* Number of AST fields */ + <%= reduce[:propagate_optional_target] %>}, /* Propagate optional target? */ +<% else %> + <%= reduce[:n_states] %>u}, <% end %> - }, <% end %> }; diff --git a/assets/parser.d.erb b/assets/parser.d.erb index f7abdbc..ee11595 100644 --- a/assets/parser.d.erb +++ b/assets/parser.d.erb @@ -875,17 +875,22 @@ immutable ushort[<%= rule.rule_set_node_field_index_map.size %>] r_<%= rule.name /** Parser reduce table. */ private immutable reduce_t[] parser_reduce_table = [ <% @parser.reduce_table.each do |reduce| %> - reduce_t(<%= reduce[:token_id] %>u, <%= reduce[:rule_id] %>u, <%= reduce[:rule_set_id] %>u, <%= reduce[:n_states] %>u + reduce_t( + <%= reduce[:token_id] %>u, /* Token: <%= reduce[:token] ? reduce[:token].name : "(any)" %> */ + <%= reduce[:rule_id] %>u, /* Rule ID */ + <%= reduce[:rule_set_id] %>u, /* Rule set ID (<%= reduce[:rule].rule_set.name %>) */ <% if @grammar.ast %> + <%= reduce[:n_states] %>u, /* Number of states */ <% if reduce[:rule].flat_rule_set_node_field_index_map? %> - , null + null, /* No rule set node field index map (flat map) */ <% else %> - , &r_<%= reduce[:rule].name.gsub("$", "_") %><%= reduce[:rule].id %>_node_field_index_map[0] + &r_<%= reduce[:rule].name.gsub("$", "_") %><%= reduce[:rule].id %>_node_field_index_map[0], /* Rule set node field index map */ <% end %> - , <%= reduce[:rule].rule_set.ast_fields.size %> - , <%= reduce[:propagate_optional_target] %> + <%= reduce[:rule].rule_set.ast_fields.size %>, /* Number of AST fields */ + <%= reduce[:propagate_optional_target] %>), /* Propagate optional target? */ +<% else %> + <%= reduce[:n_states] %>u), /* Number of states */ <% end %> - ), <% end %> ]; diff --git a/lib/propane/parser.rb b/lib/propane/parser.rb index 9f7a373..4cf7435 100644 --- a/lib/propane/parser.rb +++ b/lib/propane/parser.rb @@ -92,7 +92,7 @@ class Propane propagate_optional_target: rule.optional? && rule.components.size == 1}] elsif reduce_actions = item_set.reduce_actions reduce_actions.map do |token, rule| - {token_id: token.id, rule_id: rule.id, rule: rule, + {token: token, token_id: token.id, rule_id: rule.id, rule: rule, rule_set_id: rule.rule_set.id, n_states: rule.components.size, propagate_optional_target: rule.optional? && rule.components.size == 1} end