Парсинг грамматики abnf с использованием perl
Спасибо за вклад в вопрос, размещенный по ссылке Parse::ABNF perl. Я все еще сталкиваюсь с трудностями в решении моей проблемы. Просьба проверить мою проблему ниже и предоставить указатели для решения.
На данный момент я создал грамматику sip в формате ABNF в файле (названном так: sip.abnf
). У меня есть SIP-сообщения с заголовками в файле, как показано ниже (recd_message.txt
):
From: <sip:07455900064@212.136.178.216:5060;user=phone>;tag=1526438727-1338998848384-
To: "govoice-lab2-aokanlawon"<sip:441127653485@isf.fire.ipgcom.com>
Contact: <sip:07455900064@10.12.33.29:5070;transport=udp>
Allow: ACK,BYE,CANCEL,INFO,INVITE,OPTIONS,PRACK,REFER,NOTIFY
Accept: multipart/mixed,application/media_control+xml,application/sdp
Я создал Perl-программу для использования грамматики ABNF для проверки вышеуказанных заголовочных сообщений, названных так: testSipHeader.pl
с содержанием ниже:
use strict; use warnings;
use File::Slurp;
use Parse::ABNF ;
use Data::Dumper;
my $grammar_file = shift;
my $messages = shift;
my @header_name;
my $header_status;
my $grammar = scalar read_file( $grammar_file );
$grammar =~ s/\x0d\x0a/\n/g;
$grammar =~ s/^\s+(?=[\w-]+\s*=)//mg;
$grammar = Parse::ABNF->new->parse( scalar read_file( $grammar_file ) );
if (defined $grammar) {
print "Grammar is now defined...\n";
my $header;
open ( $header , "<", $messages) or die "Could not open $messages file";
while(<$header>) {
print "Processing the message $_\n";
@header_name = split(': ', $_);
if ($header_name[0] eq "From") {
$header_status = $grammar->From($_) ;
} elsif ($header_name[0] eq "To") {
$header_status = $grammar->To($_) ;
} elsif ($header_name[0] eq "Contact") {
$header_status = $grammar->Contact($_) ;
} elsif ($header_name[0] eq "Allow") {
$header_status = $grammar->Allow($_) ;
} elsif ($header_name[0] eq "Accept") {
$header_status = $grammar->Accept($_) ;
} else {
print "Error: Unsupported header $header_name[0] received\n";
}
}
} else {
print "Error: grammar is not defined\n";
}
Вызов Perl и вывод / ошибка ниже
$> perl -I. testSipHeader.pl sip.abnf recd_messages.txt
Grammar is now defined...
Processing the message From: <sip:07455900064@212.136.178.216:5060;user=phone>;tag=1526438727-
Can't call method "From" on unblessed reference at testSipHeader.pl line 21, <$header> line 1.
Примечание. В настоящее время у меня есть C-программа, которая генерирует заголовки SIP, и я пытаюсь проверить содержимое заголовка с помощью этих perl-функций. И я пытаюсь использовать аналогично использованию, как указано в ссылке Parse::RecDescent грамматика не работает, как ожидалось
Мне пришлось немного изменить свой скрипт, чтобы включить Parse:: ABNF и обработать входной файл, и после этого полученный вывод присутствует в пути https://drive.google.com/file/d/0B8KDQDXsCKR_ZERzV3IyY1M2NW8/edit?usp=sharing
1 ответ
Я немного переписал ваш сценарий, каков результат?
use Data::Dumper;
my $grammar_rules;
{
local $/=undef;
open(my $fh,'<',$grammar_file) or die $grammar_file,$!;
$grammar_rules = <$fh>;
$grammar_rules =~ s/\x0d\x0a/\n/g;
$grammar_rules =~ s/^\s+(?=[\w-]+\s*=)//mg;
}
print Dumper('rules',$grammar_rules);
my $grammar = Parse::ABNF->new->parse( $grammar_rules );
print Dumper('grammar',$grammar);
die "Error: grammar is not defined" if ! defined $grammer;
print "Grammar is now defined...\n";
open ( my $header_fh , "<", $messages) or die "Could not open $messages file, $!";
while(my $line = <$header_fh>) {
chomp($line);
print "Processing the message $line\n";
@header_name = split(': ', $line);
if ($header_name[0] eq "From") {
$header_status = $grammar->From($line) ;
} elsif ($header_name[0] eq "To") {
$header_status = $grammar->To($line) ;
} elsif ($header_name[0] eq "Contact") {
$header_status = $grammar->Contact($line) ;
} elsif ($header_name[0] eq "Allow") {
$header_status = $grammar->Allow($line) ;
} elsif ($header_name[0] eq "Accept") {
$header_status = $grammar->Accept($line) ;
} else {
print "Error: Unsupported header $header_name[0] received\n";
}
}