Config-Grammar
view release on metacpan or search on metacpan
lib/Config/Grammar.pm~ view on Meta::CPAN
package Config::Grammar;
use strict;
$Config::Grammar::VERSION = '1.11';
sub new($$)
{
my $proto = shift;
my $grammar = shift;
my $class = ref($proto) || $proto;
my $self = {grammar => $grammar};
bless($self, $class);
return $self;
}
sub err($)
{
my $self = shift;
return $self->{'err'};
}
sub _make_error($$)
{
my $self = shift;
my $text = shift;
$self->{'err'} = "$self->{file}, line $self->{line}: $text";
}
sub _peek($)
{
my $a = shift;
return $a->[$#$a];
}
sub _quotesplit($)
{
my $line = shift;
my @items;
while ($line ne "") {
if ($line =~ s/^"((?:\\.|[^"])*)"\s*//) {
my $frag = $1;
$frag =~ s/\\(.)/$1/g;
push @items, $frag;
} elsif ($line =~ s/^'((?:\\.|[^'])*)'\s*//) {
my $frag = $1;
$frag =~ s/\\(.)/$1/g;
push @items, $frag;
}
elsif ($line =~ s/^((?:\\.|[^\s])*)(?:\s+|$)//) {
my $frag = $1;
$frag =~ s/\\(.)/$1/g;
push @items, $frag;
}
else {
die "Internal parser error for '$line'";
}
}
return @items;
}
sub _check_mandatory($$$$)
{
my $self = shift;
my $g = shift;
my $c = shift;
my $section = shift;
# check _mandatory sections, variables and tables
if (defined $g->{_mandatory}) {
for (@{$g->{_mandatory}}) {
if (not defined $g->{$_}) {
$g->{$_} = {};
}
if (not defined $c->{$_}) {
if (defined $section) {
$self->{'err'} .= "$self->{file} ($section): ";
}
else {
$self->{'err'} = "$self->{file}: ";
}
if (defined $g->{$_}{_is_section}) {
$self->{'err'} .= "mandatory (sub)section '$_' not defined";
}
elsif ($_ eq '_table') {
$self->{'err'} .= "mandatory table not defined";
}
else {
$self->{'err'} .= "mandatory variable '$_' not defined";
}
return 0;
}
}
}
for (keys %$c) {
# do some cleanup
ref $c->{$_} eq 'HASH' or next;
defined $c->{$_}{_is_section} or next;
$self->_check_mandatory($g->{$c->{$_}{_grammar}}, $c->{$_},
defined $section ? "$section/$_" : "$_") or return 0;
delete $c->{$_}{_is_section};
delete $c->{$_}{_grammar};
delete $c->{$_}{_order_count} if exists $c->{$_}{_order_count};
}
return 1;
}
######### SECTIONS #########
( run in 1.677 second using v1.01-cache-2.11-cpan-364913b4093 )