В каком формате находится этот конфигурационный файл?

#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",
    },
  ],
}