我是新手。我想使用flex / bison解析bibtex文件。一个样品 bibtex是:
@Book{a1,
author="amook",
Title="ASR",
Publisher="oxf",
Year="2010",
Add="UK",
Edition="1",
}
@Article{a2,
Author="Rudra Banerjee",
Title={FeNiMo},
Publisher={P{\"R}B},
Issue="12",
Page="36690",
Year="2011",
Add="UK",
Edition="1",
}
为了解析这个问题,我编写了以下代码:
%{
#include <stdio.h>
#include <stdlib.h>
%}
%{
char yylval;
int YEAR,i;
//char array_author[1000];
%}
%x author
%x title
%x pub
%x year
%%
@ printf("\nNEWENTRY\n");
[a-zA-Z][a-zA-Z0-9]* {printf("%s",yytext);
BEGIN(INITIAL);}
author= {BEGIN(author);}
<author>\"[a-zA-Z\/.]+\" {printf("%s",yytext);
BEGIN(INITIAL);}
year= {BEGIN(year);}
<year>\"[0-9]+\" {printf("%s",yytext);
BEGIN(INITIAL);}
title= {BEGIN(title);}
<title>\"[a-zA-Z\/.]+\" {printf("%s",yytext);
BEGIN(INITIAL);}
publisher= {BEGIN(pub);}
<pub>\"[a-zA-Z\/.]+\" {printf("%s",yytext);
BEGIN(INITIAL);}
[a-zA-Z0-9\/.-]+= printf("ENTRY TYPE ");
\" printf("QUOTE ");
\{ printf("LCB ");
\} printf(" RCB");
; printf("SEMICOLON ");
\n printf("\n");
%%
int main(){
yylex();
//char array_author[1000];
//printf("%d%s",&i,array_author[i]);
i++;
return 0;
}
问题是我想要将key和val分开来 变量并将其存储在某个地方(可能是数组)。 我可以有一些见解吗?
答案 0 :(得分:0)
如果我在一年前看到这个问题,我会发表同时评论,这样可以改善这个问题。提供的代码不是解析器,而是仅为flex编码的正则表达式。使用正则表达式扫描输入文件的标记只是构建解析器的一部分。没有为bison定义bibtex文件的语法或结构。
要分离键和val,如果只需要所需的全部内容,可以使用awk和sed等工具轻松完成。我要指出的一点是,vals总是遵循一个等号。有点使他们很容易识别,没有任何特殊的句法jiggery pokery。
由于我们没有关于为什么的信息,我们需要解析一个bibtex文件,而这个练习的最终目标很难看出什么是最好的方法。
编辑:这个问题是重复的,因为OP再次询问并回答:parse bibtex with flex+bison: revisited