Schrift
[thread]8554[/thread]

Parsing von BNF

Leser: 2


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
weismat
 2006-12-06 15:02
#72279 #72279
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Hallo,
Ich würde gerne BNF Nachrichten in einen Hash mit Referenzen entweder auf Werte oder weitere Hashes parsen.
Das Ganze sollte so etwas liefern wie zum Beispiel XML::Simple ein XML in eine Struktur parst.
Ein Beispiel für eine BNF-Nachricht wäre:
{key1={key11=value11} | key2 = value2 | key3 = {key31=value31 | key32 = value32 | key33 = {key331=value331}}}.
esskar
 2006-12-06 15:41
#72280 #72280
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
vielleicht hilft: CPAN:Parse::RandGen
topeg
 2006-12-06 18:45
#72281 #72281
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das sollte funktionieren:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $data='{key1={key11=value11} | key2 = value2 | key3 = {key31=value31 | key32 = value32 | key33 = {key331=value331}}}';

sub parse($)
{
my $data=shift(@_);
my $rcu;
$rcu=sub
{
my $ref;
if($data=~s/^\s*\{//s)
{
$ref={};
while(index($data,'}')!=0)
{
$data=~s/^[\|\s]*(.+?)\s*=//s;
my $n=$1;
$ref->{$n}=$rcu->();
}
$data=~s/^}//;
}
else
{
$data=~s/^\s*(.+?)\s*(\||\})/$2/s;
$ref=$1;
}
return $ref;
};
return $rcu->();
}

print Dumper(parse($data))."\n";
weismat
 2006-12-07 09:47
#72282 #72282
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Exzellent! Vielen Dank!\n\n

<!--EDIT|weismat|1165508675-->
weismat
 2006-12-07 18:26
#72283 #72283
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Ich habe nur das Problem, daß ich die Routine in ein Package packen möchte und da funktioniert die Sache nicht ..Direkt in den Quellcode kopiert, ist alles fein.
Kann mir da jemand helfen?
topeg
 2006-12-07 18:44
#72284 #72284
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my $data='{key1={key11=value11} | key2 = value2 | key3 = {key31=value31 | key32 = value32 | key33 = {key331=value331|key332={key3321=value3321|key3322=value3322|key3321=value3322}|key333=value333|key334=value334}}}';

package BNF;
sub encode($)
{
my $data=shift(@_);
my $rcu;
$rcu=sub
{
my $ref;
if($data=~s/^\s*\{//s)
{
$ref={};
while(index($data,'}')!=0)
{
$data=~s/^[\|\s]*(.+?)\s*=//s;
my $n=$1;
$ref->{$n}=$rcu->();
}
$data=~s/^}//;
}
else
{
$data=~s/^\s*(.+?)\s*(\||\})/$2/s;
$ref=$1;
}
return $ref;
};
return $rcu->();
}
package main;

print Dumper(BNF::encode($data))."\n";

Und was funktioniert nicht?
weismat
 2006-12-07 21:34
#72285 #72285
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Sorry...Du hast recht...ich hatte äbhangig davon, ob es Leerzeichen zwischen den geschweiften Klammern gibt, Probleme und habe dabei übersehen, daß ich das Package selber zerstört habe....nochmals vielen Dank!
weismat
 2006-12-12 17:16
#72286 #72286
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Wie könnte ich das Programm einschränken, damit ich unter Umständen nur einschliesslich der 2. Ebene parse?
Meine längste Nachricht hat eine Länge von 1.6 MB mit 5 Ebenen und da dauert es schon Minuten - ich könnte mir vorstellen, daß ein Parsen bis zur zweiten Ebene und dann ein späteres Parsen der unteren Ebene viel schneller ist....oder sehe ich das falsch?
renee
 2006-12-12 17:26
#72287 #72287
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn Du eine richtige BNF vorliegen hast, würde ich mir vielleicht mal CPAN:Parse::RecDescent anschauen... Allerdings weiß ich nicht, wie schnell das Ganze ist...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
weismat
 2006-12-12 22:17
#72288 #72288
User since
2003-08-18
142 Artikel
BenutzerIn
[default_avatar]
Meine Messages sind im BNF-Format - nicht direkt die Grammatik.
Ich werde mal schauen, ob/wie ich das rekursive Format in ein iteratives Format umwandle...aber ich bin leider kein Experte...
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-12-06 15:02.