2011-04-16 4 views
1

J'essaie d'analyser les fichiers Bibtex en utilisant lex/yacc. Les chaînes de la base de données bibtex peuvent être entourées de guillemets "..." ou d'accolades - {...}Regex pour les chaînes dans Bibtex

Mais chaque entrée est également entourée d'accolades. Comment faire la différence entre une entrée et une chaîne entourée d'accolades?

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

Carsten ne pense pas. Mais cela ne peut pas être utilisé pour différencier le {} extérieur de la chaîne {}. La définition de @book peut ne pas avoir de sauts de ligne. –

+0

Bonjour, Comme vous utilisez yacc de toute façon, vous pouvez retarder la désambiguïsation jusqu'à la phase d'analyse. Dans ce cas, vous n'êtes pas limité à regex. Existe-t-il une exigence particulière pour obtenir le travail effectué par le lexer? Cordialement carsten – collapsar

Répondre

1

vous avez différentes options:

  • lexer conditions de démarrage (à partir d'un Lex tutorial)

    bâtiment sur les idées de greg ward, d'améliorer vos règles de lex conditions de démarrage ('modes' comme ils sont appelés dans la source référencée).

spécifiquement, vous auriez les conditions de démarrage BASIC ENTRY STRING et les règles suivantes (exemple pris et légèrement améliorés par rapport 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; } 

s'il vous plaît noter que l'ensemble de règles est pas complète mais devrait vous avez commencé. plus de détails à trouver here.

  • btparse

    These docs expliquer dans un thenintricacies de mode assez détaillé de l'analyse syntaxique des formats bibtex et est livré avec un « analyseur de python.

  • vous pouvez également
  • biblex

    être intéressé par l'emploi de la chaîne d'outils unix biblex et bibparse. ces outils génèrent et analysent un flux de jetons bibtex, respectivement.

    plus d'informations peuvent être trouvées here.

meilleures salutations,

+0

Super! Mais la mission était due depuis un mois - alors j'ai compris quelque chose comme votre code. Plusieurs états et suivi des accolades/parenthèses. –

Questions connexes