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 %>,
<% 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
def enumerate
id = 0
states = {}
visit = lambda do |state|
unless states.include?(state)
id += 1
states[state] = id
state.transitions.each do |transition|
visit[transition.destination]
@_enumerated ||=
begin
id = 0
states = {}
visit = lambda do |state|
unless states.include?(state)
id += 1
states[state] = id
state.transitions.each do |transition|
visit[transition.destination]
end
end
end
visit[@start_state]
states
end
end
visit[@start_state]
states
end
end