Ich habe folgende EingabeMit Parse :: RecDescent
@Book{press,
author = "Press, W. and Teutolsky, S. and Vetterling, W. and Flannery B.",
title = "Numerical {R}ecipes in {C}: The {A}rt of {S}cientific {C}omputing",
year = 2007,
publisher = "Cambridge University Press"
}
und ich habe eine Grammatik für RecDescent Parser-Generator zu schreiben. Daten am Ausgang sollten für die XML-Struktur geändert werden und sollen wie folgt aussehen:
<book>
<keyword>press</keyword>
<author>Press, W.+Teutolsky, S.+Vetterling, W.+Flannery B.</author>
<title>Numerical {R}ecipes in {C}: The {A}rt of {S}cientific {C}omputing</title>
<year>2007</year>
<publisher>Cambridge University Press</publisher>
</book>
Zusätzliche und wiederholten Felder sollten als Fehler gemeldet werden (richtige Nachricht mit Zeilennummer und keine weiteren Analyse). Ich habe versucht, mit etwas wie folgt zu beginnen:
use Parse::RecDescent;
open(my $in, "<", "parsing.txt") or die "Can't open parsing.txt: $!";
my $text;
while (<$in>) {
$text .= $_;
}
print $text;
my $grammar = q {
beginning: "\@Book\{" keyword fields "\}" { print "<book>\n",$item[2],$item[3],"</book>"; }
keyword: /[a-zA-Z]+/ "," { return " <keyword>".$item[1]."</keyword>\n"; }
fields: one "," two "," tree "," four { return $item[1].$item[3].$item[5].$item[7]; }
one: "author" "=" "\"" /[a-zA-Z\s\.\,\{\}\:]+/ "\"" { $item[4] =~ s/\sand\s/\+/g;
return " <author>",$item[4],"</author>\n"; }
two: "title" "=" "\"" /[a-zA-Z\s\.\,\{\}\:]+/ "\"" { $item[4] =~ s/\sand\s/\+/g;
return " <title>",$item[4],"</title>\n"; }
three: "year" "=" /[0-2][0-9][0-9][0-9]/ { return " <year>",$item[3],"</year>\n"; }
four: "publisher" "=" "\"" /[a-zA-Z\s\.\,\{\}\:]+/ "\""
{ $item[4] =~ s/\sand\s/\+/g;
return " <publisher>",$item[4],"</publisher>\n"; }
};
my $parser = new Parse::RecDescent($grammar) or die ("Bad grammar!");
defined $parser->beginning($text) or die ("Bad text!");
Aber ich weiß nicht einmal, ob es der richtige Weg ist, es zu tun. Bitte helfen Sie.
Es gibt noch ein kleines Problem. Tags bei der Eingabe sind möglicherweise nicht in dieser bestimmten Reihenfolge, aber jedes Tag kann nur einmal vorkommen. Muss ich für alle Permutationen von (Autor, Titel, Jahr, Verlag) Unterregeln schreiben? Weil ich kam mit:
fields: field "," field "," field "," field
field: one | two | three | four
aber es ist offensichtlich nicht verhindern, Tags zu wiederholen.
Sieht aus wie Sie zu einem guten Start sind. Welches Problem hast du? – cam
Es gibt eine Grenze dafür, wie viel Arbeit Sie von Ihrer Grammatik erwarten sollten. Versuche nicht, die Nichtwiederholung in deiner Grammatik zu erzwingen. das ist etwas, mit dem Sie umgehen können, sobald Sie es in eine geeignete Datenstruktur geparst haben. Anstatt also direkt von BibTeX zu XML zu wechseln, analysieren Sie eine Zwischenstruktur, führen Berechnungen für die Struktur durch und geben sie anschließend in XML aus. –