Add SymbolID

This commit is contained in:
Josh Holtrop 2023-07-10 22:17:54 -04:00
parent 9dbae78724
commit 950fafc872
2 changed files with 10 additions and 4 deletions

View File

@ -448,10 +448,15 @@ class <%= @classname %>
static class Parser static class Parser
{ {
alias ReduceID = <%= get_type_for(@parser.reduce_table.size) %>; alias ReduceID = <%= get_type_for(@parser.reduce_table.size) %>;
<% # A "symbol" is either a token ID or a rule set ID. %>
<% # %>
<% # Rule set IDs start after token IDs, so to store either a token ID %>
<% # or a rule set ID, we just need to know the maximum rule set ID. %>
alias SymbolID = <%= get_type_for(@parser.rule_sets.map(&:last).map(&:id).max) %>;
private struct Shift private struct Shift
{ {
uint symbol; SymbolID symbol;
uint state; uint state;
} }
@ -459,7 +464,7 @@ class <%= @classname %>
{ {
Token token; Token token;
uint rule; uint rule;
uint rule_set; SymbolID rule_set;
uint n_states; uint n_states;
} }
@ -514,7 +519,7 @@ class <%= @classname %>
Lexer.TokenInfo token_info; Lexer.TokenInfo token_info;
Token token = INVALID_TOKEN_ID; Token token = INVALID_TOKEN_ID;
StateValue[] statevalues = new StateValue[](1); StateValue[] statevalues = new StateValue[](1);
uint reduced_rule_set = INVALID_ID; size_t reduced_rule_set = INVALID_ID;
ParserValue reduced_parser_value; ParserValue reduced_parser_value;
for (;;) for (;;)
{ {
@ -592,7 +597,7 @@ class <%= @classname %>
return parse_result.v_<%= start_rule_type[0] %>; return parse_result.v_<%= start_rule_type[0] %>;
} }
private uint check_shift(uint state, uint symbol) private uint check_shift(uint state, size_t symbol)
{ {
uint start = states[state].shift_table_index; uint start = states[state].shift_table_index;
uint end = start + states[state].n_shift_entries; uint end = start + states[state].n_shift_entries;

View File

@ -5,6 +5,7 @@ class Propane
attr_reader :state_table attr_reader :state_table
attr_reader :shift_table attr_reader :shift_table
attr_reader :reduce_table attr_reader :reduce_table
attr_reader :rule_sets
def initialize(grammar, rule_sets, log) def initialize(grammar, rule_sets, log)
@grammar = grammar @grammar = grammar