gpt4 book ai didi

perl - 解析文本时是否有一个好的 CPAN 模块来实现状态机?

转载 作者:行者123 更新时间:2023-12-03 17:08:02 25 4
gpt4 key购买 nike

在解析文本时,我经常需要按照下面的代码以通用形式实现迷你状态机。

是否有一个 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 {

}

}

最佳答案

我建议看看 MarpaMarpa::XS .
看看this simple calculator .

my $grammar = Marpa::XS::Grammar->new(
{ start => 'Expression',
actions => 'My_Actions',
default_action => 'first_arg',
rules => [
{ lhs => 'Expression', rhs => [qw'Term'] },
{ lhs => 'Term', rhs => [qw'Factor'] },
{ lhs => 'Factor', rhs => [qw'Number'] },
{ lhs => 'Term', rhs => [qw'Term Add Term'], action => 'do_add' },
{ lhs => 'Factor',
rhs => [qw'Factor Multiply Factor'],
action => 'do_multiply'
},
],
}
);
您必须自己实现标记器。

关于perl - 解析文本时是否有一个好的 CPAN 模块来实现状态机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9360564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com