Regex Bibtex中字符串的正则表达式

Regex Bibtex中字符串的正则表达式,regex,variable-assignment,lex,Regex,Variable Assignment,Lex,我正在尝试使用lex/yacc解析Bibtex文件。bibtex数据库中的字符串可以用引号“…”或大括号-{…}括起来 但每个条目也用大括号括起来。如何区分条目和用大括号括起来的字符串 @Book{sweig42, Author = { Stefan Sweig }, title = { The impossible book }, publisher = { Dead Poet Society}, year = 1942, month =

我正在尝试使用lex/yacc解析Bibtex文件。bibtex数据库中的字符串可以用引号“…”或大括号-{…}括起来

但每个条目也用大括号括起来。如何区分条目和用大括号括起来的字符串

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

您有多种选择:

  • lexer启动条件(从a开始)

    基于来自的想法,使用起始条件(“模式”在引用的源代码中被调用)增强您的lex规则

具体地说,您将拥有开始条件
基本输入字符串
和以下规则(示例从中选取并稍微增强):

%START基本条目字符串
%%
/*词汇语法,模式1:顶级*/
在@{BEGIN ENTRY;}
换行符\n
注释\%[^\n]*\n
空白。[\\r\t]+
垃圾[^@\n\\r\t]+
/*词汇语法,模式2:输入法*/
换行符\n
注释\%[^\n]*\n
空白[\\r\t]+
编号[0-9]+
名称[a-z0-9\!\$\&\*\+\-\.\/\:\;\\?\[\]\^\\\`\\\\\\\\\\\\\\\\\\\\\\]+{if(stricmp(yytext,“comment”)==0){BEGIN STRING;}
LBRACE\{if(delim='\0'{delim='}';}else{blevel=1;BEGIN STRING;}}
RBRACE\}{BEGIN BASIC;}
LPAREN\({BEGIN STRING;delim=');plevel=1;}
RPAREN\)
相等于=
散列\#
逗号,
QUOTE\“{BEGIN STRING;bleveL=0;plevel=0;}
/*词汇语法,模式3:字符串*/
LBRACE\{if(blevel>0){blevel++;}
RBRACE\}{if(blevel>0){blevel--;if(blevel==0){BEGIN ENTRY;}}}
LPAREN\({if(plevel>0){plevel++;}}
RPAREN\}{if(plevel>0){plevel--;if(plevel==0){BEGIN ENTRY;}}}
引号\“{BEGIN ENTRY;}
请注意,规则集绝对不完整,但应该让您开始。更多详细信息将被找到

  • btparse

    以相当详细的方式解释解析bibtex格式的复杂性,并附带“python解析器”

  • biblex

    您可能还对使用unix工具链biblex和bibparse感兴趣。这些工具分别生成和解析bibtex令牌流

    可以找到更多信息


向您致意,卡斯滕您有多种选择:

  • lexer启动条件(从a开始)

    基于来自的想法,使用起始条件(“模式”在引用的源代码中被调用)增强您的lex规则

具体地说,您将拥有开始条件
基本输入字符串
和以下规则(示例从中选取并稍微增强):

%START基本条目字符串
%%
/*词汇语法,模式1:顶级*/
在@{BEGIN ENTRY;}
换行符\n
注释\%[^\n]*\n
空格。[\\r\t]+
垃圾[^@\n\\r\t]+
/*词汇语法,模式2:输入法*/
换行符\n
注释\%[^\n]*\n
空白[\\r\t]+
编号[0-9]+
名称[a-z0-9\!\$\&\*\+\-\.\/\:\;\\?\[\]\^\\\`\\\\\\\\\\\\\\\\\\\\\\]+{if(stricmp(yytext,“comment”)==0){BEGIN STRING;}
LBRACE\{if(delim='\0'{delim='}';}else{blevel=1;BEGIN STRING;}}
RBRACE\}{BEGIN BASIC;}
LPAREN\({BEGIN STRING;delim=');plevel=1;}
RPAREN\)
相等于=
散列\#
逗号,
QUOTE\“{BEGIN STRING;bleveL=0;plevel=0;}
/*词汇语法,模式3:字符串*/
LBRACE\{if(blevel>0){blevel++;}
RBRACE\}{if(blevel>0){blevel--;if(blevel==0){BEGIN ENTRY;}}}
LPAREN\({if(plevel>0){plevel++;}}
RPAREN\}{if(plevel>0){plevel--;if(plevel==0){BEGIN ENTRY;}}}
引号\“{BEGIN ENTRY;}
请注意,规则集绝对不完整,但应该让您开始。更多详细信息将被找到

  • btparse

    以相当详细的方式解释解析bibtex格式的复杂性,并附带“python解析器”

  • biblex

    您可能还对使用unix工具链biblex和bibparse感兴趣。这些工具分别生成和解析bibtex令牌流

    可以找到更多信息


最好的问候,carsten不这么认为。但这不能用来区分外部的{}和字符串的{}“@book定义可能没有换行符。您好,因为您使用的是yacc,所以您可能会将消歧延迟到解析阶段。在这种情况下,您不限于正则表达式。是否有特殊要求由lexer完成此工作?最好不要这样认为。但这不能用于区分外部{}”从字符串的{}“@book”定义可能没有换行符。您好,由于您使用的是yacc,您可能会将消歧延迟到解析阶段。在这种情况下,您不仅限于正则表达式。是否有特殊要求让lexer完成此工作?非常好!但作业应在一个月前完成-因此我想出了一些办法喜欢你的代码。多个状态并跟踪大括号/圆括号。太好了!但是作业一个月前就到期了-所以我想出了一些类似于你的代码的东西。多个状态并跟踪大括号/圆括号。
%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; }