У меня есть следующие входныеИспользование Анализировать :: 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"
}
, и я должен написать грамматику для генератора синтаксических анализаторов RecDescent. Данные на выходе должны быть изменены для структуры XML и должен выглядеть следующим образом:
<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>
Дополнительные и повторные поля должны быть представлены в виде ошибок (соответствующее сообщение с номером строки и без дальнейшего разбора). Я попытался начать с примерно так:
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!");
Но я даже не знаю, правильно ли это сделать. Пожалуйста помоги.
Есть еще одна крошечная проблема. Теги на входе могут быть не в том конкретном порядке, но каждый тег может появляться только один раз. Должен ли я писать субрулы для всех перестановок (автор, название, год, издатель)? Потому что я придумал:
fields: field "," field "," field "," field
field: one | two | three | four
но он, очевидно, не мешает повторять теги.
Похоже, вы на хороший старт. Какая у вас проблема? – cam
Существует ограничение на то, какую работу вы должны просить грамматику. не пытайтесь принуждать вас к безрецепции в вашей грамматике; это то, с чем вы можете иметь дело, как только вы проанализировали его в подходящей структуре данных. Поэтому вместо перехода от BibTeX к XML, проанализируйте промежуточную структуру, выполните вычисления по структуре, а затем выведите на XML впоследствии. –