#python #perl #config
#python #perl #конфигурация
Вопрос:
Я должен проанализировать конфигурационные файлы, которые выглядят следующим образом:
begin
key1 "value1"
key2 "value2"
begin
key3 "value3"
key4 "value4"
end
end
Что это за формат и есть ли готовый синтаксический анализатор, который я могу использовать (желательно на Perl / Python)?
Комментарии:
1. Он выглядит примерно как формат lircrc.
2. Также немного похоже на этот: en.wikibooks.org/wiki/Windows_Programming /…
Ответ №1:
Я не знаю названия формата, но Parser::MGC может легко справиться с этим.
Определив простой parse
саморекурсивный метод, который распознает begin
блоки как внутренние области, мы можем построить рекурсивное дерево ссылок на хэши из входных данных.
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",
},
],
}