0
朋友,我解析一个bibtex文件,在文件中有多个bibtex条目,例如yyaccept后恢复yyparse
@Book{a1,
Title="ASR",
Publisher="oxf",
Author = {a {\"m}ook, Rudra Banerjee},
Year="2010",
Address="UK",
Edition="1",
}
@Article{a2,
Author="Rudra Banerjee",
Title="Fe{\"Ni}Mo",
Publisher="P{\"R}B",
Number="12",
Pages="36690",
Year="2011",
Address="UK",
Edition="1",
}
现在,我想yyparse每个条目后恢复,因此,我的解析器:
%union
{
char *sval;
};
%token <sval> VALUE
%token <sval> KEY
%token OBRACE
%token EBRACE
%token QUOTE
%token SEMICOLON
%start Input
%%
Input:
/* empty */
| Input Entry ; /* input is zero or more entires */
Entry:
'@' KEY '{' KEY ','{
g_hash_table_insert(table, g_strdup("TYPE"), g_strdup($2));
g_hash_table_insert(table, g_strdup("ID"), g_strdup($4));
g_printf("%s:%s\n","KEY=>",g_hash_table_lookup(table,"TYPE"));
// g_printf("%s: %s\n", $2, $4);
}
KeyVals '}'
{YYACCEPT;}
;
KeyVals:
/* empty */
| KeyVals KeyVal ; /* zero or more keyvals */
KeyVal:
KEY '=' VALUE ',' { g_hash_table_insert(table, g_strdup($1), g_strdup($3));
// g_printf("%s: %s\n", $1, $3);
g_printf("%s:%s\n",$1,g_hash_table_lookup(table,$1));
};
%%
,并在主程序中,它被称为:
do{
yyparse();
}
问题是,它正确解析,但只有第一个条目;即它不从YYACCEPT恢复。 yyaccept之后,如何让代码重新调用yyparse?
这跟How do I convince Bison to parse part of a file?的问题几乎是一样的但我没能解决我的问题。
上面看起来正确(模C语法),并应该作为'Entry'有一个默认的减少。它以什么方式不起作用?当然,在再次调用'yyparse()'之前,您需要重置全局'表'。在调用yyparse之前,尝试使用'-DYYDEBUG'编译并设置'yydebug = 1'来获取更多关于解析器正在做什么的信息。 – 2013-04-09 16:32:47
@ChrisDodd,谢谢你的回复。 如果我打印输出, '$ ./parse:书 名称: “ASR” 出版商: “OXF” 作者:{A {\“M}的OOK,陀罗纳吉} 年:“2010” 地址:“英国” 版:“1” ' 是所有我所得到的,即它被正确解析中的第一项,但不returnning到下一个条目 请帮助。 –
BaRud
2013-04-09 16:49:39