Есть ли хороший модуль CPAN для реализации конечных автоматов при синтаксическом анализе текста?

При синтаксическом анализе текста мне часто приходится реализовывать мини-конечные автоматы в общей форме, следуя приведенному ниже коду.

Существует ли модуль 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 {

    }

}
8
задан DVK 20 February 2012 в 11:42
поделиться