Регулярное выражение для строк в Bibtex - PullRequest
1 голос
/ 17 апреля 2011

Я пытаюсь проанализировать файлы Bibtex, используя lex / yacc.Строки в базе данных bibtex могут быть заключены в кавычки "..." или в фигурные скобки - {...}

Но каждая запись также заключена в фигурные скобки.Как отличить запись от строки, заключенной в фигурные скобки?

@Book{sweig42,
  Author =   { Stefan Sweig },
  title =    { The impossible book },
  publisher =    { Dead Poet Society},
  year =     1942,
  month =        mar
}

1 Ответ

1 голос
/ 01 июня 2011

у вас есть различные варианты:

  • условия запуска лексера (из учебника Lex )

    на основе идей gregward , улучшите свои правила lex с помощью условий запуска («режимов», как они называются в указанном источнике).

, в частности, у вас будут условия запуска BASIC ENTRY STRINGследующие правила (пример взят и немного улучшен с здесь ):

%START BASIC ENTRY STRING
%%

/* Lexical grammar, mode 1: top-level */
<BASIC>AT           @ { BEGIN ENTRY; }
<BASIC>NEWLINE      \n
<BASIC>COMMENT      \%[^\n]*\n
<BASIC>WHITESPACE.  [\ \r\t]+
<BASIC>JUNK         [^@\n\ \r\t]+

/* Lexical grammar, mode 2: in-entry */
<ENTRY>NEWLINE      \n
<ENTRY>COMMENT      \%[^\n]*\n
<ENTRY>WHITESPACE   [\ \r\t]+
<ENTRY>NUMBER       [0-9]+
<ENTRY>NAME         [a-z0-9\!\$\&\*\+\-\.\/\:\;\<\>\?\[\]\^\_\`\|]+ { if (stricmp(yytext, "comment")==0) { BEGIN STRING; } }
<ENTRY>LBRACE       \{ { if (delim == '\0') { delim='}'; } else { blevel=1; BEGIN STRING; } }
<ENTRY>RBRACE       \} { BEGIN BASIC; }
<ENTRY>LPAREN       \( { BEGIN STRING; delim=')'; plevel=1; }
<ENTRY>RPAREN       \)
<ENTRY>EQUALS       =
<ENTRY>HASH         \#
<ENTRY>COMMA        ,
<ENTRY>QUOTE        \" { BEGIN STRING; bleveL=0; plevel=0; }

/* Lexical grammar, mode 3: strings */
<STRING>LBRACE       \{ { if (blevel>0) {blevel++;} }
<STRING>RBRACE       \} { if (blevel>0) { blevel--; if (blevel == 0) { BEGIN ENTRY; } } }
<STRING>LPAREN       \( { if (plevel>0) { plevel++;} }
<STRING>RPAREN       \} { if (plevel>0) { plevel--; if (plevel == 0) { BEGIN ENTRY; } } }
<STRING>QUOTE        \" { BEGIN ENTRY; }

обратите внимание, что набор правил ни в коем случае не завершен, но должен помочь вам начать.Более подробную информацию можно найти здесь .

  • btparse

    Эти документы довольно подробно объясняют особенности анализа парсингаbibtex форматируется и поставляется с синтаксическим анализатором 'python.

  • biblex

    Вам также может быть интересно использовать набор инструментов Unix для biblex и bibparse.эти инструменты генерируют и анализируют поток токенов bibtex, соответственно.

    больше информации можно найти здесь .

наилучшими пожеланиями, Carsten

...