我必须解析看起来像这样的配置文件:
begin
key1 "value1"
key2 "value2"
begin
key3 "value3"
key4 "value4"
end
end
这种格式是什么,我可以使用现成的解析器(最好是在Perl / Python中)?
答案 0 :(得分:2)
我不知道格式的名称,但Parser::MGC可以使这个格式更轻松。
通过定义一个简单的自递归parse
方法,将begin
块识别为内部范围,我们可以从输入构建一个HASH引用的递归树。
package MyParser;
use base 'Parser::MGC';
use strict;
use warnings;
# Need to exclude linefeeds from the whitespace pattern
sub pattern_ws { qr/[\t ]+/ }
sub parse
{
my $self = shift;
my %items;
$self->sequence_of( sub {
$self->any_of(
sub {
# begin ... end block
$self->expect( 'begin' );
$self->commit;
$self->expect( qr/\n/ );
$self->scope_of( undef, sub {
push @{$items{begin}}, $self->parse;
}, 'end' );
$self->expect( qr/\n/ );
},
sub {
# key "value"
my $key = $self->token_ident;
$self->commit;
$items{$key} = $self->token_string;
$self->expect( qr/\n/ );
},
)
});
return \%items;
}
这可以在最后打印,可能使用Data::Dump
:
use Data::Dump 'pp';
print STDERR pp(MyParser->new->from_file(\*STDIN));
这给出了
{
begin => [
{
begin => [{ key3 => "value3", key4 => "value4" }],
key1 => "value1",
key2 => "value2",
},
],
}