Start generating lexer states and transitions

This commit is contained in:
Josh Holtrop 2021-06-23 23:15:02 -04:00
parent 5881f13380
commit 2122ca02fe
2 changed files with 43 additions and 11 deletions

View File

@ -10,4 +10,33 @@ class <%= classname %>
TOKEN_<%= token.c_name %>, TOKEN_<%= token.c_name %>,
<% end %> <% end %>
} }
private struct Transition
{
uint first;
uint last;
uint dest;
}
private struct LexerState
{
Transition[] transitions;
size_t accepts;
}
private static const LexerState lexer_states[] = [
<% lexer_dfa.enumerate.each do |state, index| %>
LexerState([
<% state.transitions.each do |transition| %>
Transition(<%= transition.code_point_range.first %>, <%= transition.code_point_range.last %>, <%= lexer_dfa.enumerate[transition.destination] %>),
<% end %>
],
<% if state.accepts %>
<%= state.accepts.id %>,
<% else %>
cast(size_t)-1,
<% end %>
),
<% end %>
];
} }

View File

@ -39,19 +39,22 @@ module Imbecile
end end
def enumerate def enumerate
id = 0 @_enumerated ||=
states = {} begin
visit = lambda do |state| id = 0
unless states.include?(state) states = {}
id += 1 visit = lambda do |state|
states[state] = id unless states.include?(state)
state.transitions.each do |transition| id += 1
visit[transition.destination] states[state] = id
state.transitions.each do |transition|
visit[transition.destination]
end
end
end end
visit[@start_state]
states
end end
end
visit[@start_state]
states
end end
end end