При синтаксическом анализе текста мне часто требуется реализовать мини-автоматы в общей форме, следующей за кодом, приведенным ниже.
Существует ли модуль CPAN, который считается «наилучшей практикой» и хорошо подходит для реализации состояниямашинная логика, подобная этой, в простой и элегантной форме?
Я бы предпочел решения, менее сложные, чем Parse::RecDescent
, но если их не существует и Parse::RecDescent
гораздо проще применить к этой проблеме, чем я думал, я 'я очень хочу рассмотреть это вместо того, чтобы кататься по своим собственным словам, как я был до сих пор.
Пример общего кода синтаксического анализа:
my $state = 1;
while (my $token = get_next_token()) { # Usually next line
if ($state == 1) {
do_state1_processing();
if (token_matches_transition_1_to_2($token)) {
do_state_1_to_2_transition_processing();
$state == 2;
next;
} elsif (token_matches_transition_1_to_4($token)) {
do_state_1_to_4_transition_processing();
$state == 4;
next;
} else {
do_state1_continuation();
next;
}
} elsif ($state == 5) {
do_state5_processing();
if (token_matches_transition_5_to_6($token)) {
do_state_5_to_6_transition_processing();
$state == 6;
next;
} elsif (token_matches_transition_5_to_4($token)) {
do_state_5_to_4_transition_processing();
$state == 4;
next;
} else {
do_state5_continuation();
next;
}
} else {
}
}