у вас есть различные варианты:
условия запуска лексера (из учебника 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