2011-04-16 17 views
1

我想使用lex/yacc解析Bibtex文件。 bibtex數據庫中的字符串可以用引號「...」或括號括起來 - {...}在Bibtex中的字符串正則表達式

但是每個條目也都括在大括號中。如何區分條目和大括號包圍的字符串?

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

不這麼認爲。但是這不能用來區分外部{}和字符串的{}。 @book定義可能沒有換行符。 – 2011-04-16 21:28:03

+0

你好,正如你使用yacc無論如何,你可能會延遲消歧直到解析階段。在這種情況下,你不限於正則表達式。詞法分析器完成工作是否有特定的要求?此致敬禮 – collapsar 2011-05-31 23:12:56

回答

1

你有多種選擇:

  • 詞法啓動條件(從Lex tutorial)的想法

    建築從greg ward,與啓動條件提升您的lex規則( '模式' 作爲他們被稱爲參考源)。

具體地說,你就必須啓動條件BASIC ENTRY STRING如下規則(採取例如從here略微增強):

%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; } 

請注意,規則集是不完整,但應該讓你開始。更多細節被發現here

  • btparse

    These docs在解析中文提供格式相當詳細地解釋thenintricacies並配有「蟒蛇分析器。

  • biblex

    您可能也有興趣使用的biblex和bibparse的UNIX工具鏈。這些工具分別生成並解析bibtex標記流。

    更多信息可查詢here

最好的問候,卡斯滕

+0

太棒了!但是這項工作是在一個月前完成的 - 所以我想出了一些類似於你的代碼的東西。多個狀態並跟蹤大括號/括號。 – 2011-06-01 05:02:57