Start generating lexer states and transitions
This commit is contained in:
parent
5881f13380
commit
2122ca02fe
@ -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 %>
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user