朋友们,我正在解析一个bibtex文件,在一个文件中有多个bibtex条目,例如
@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:%sn","KEY=>",g_hash_table_lookup(table,"TYPE"));
// g_printf("%s: %sn", $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: %sn", $1, $3);
g_printf("%s:%sn",$1,g_hash_table_lookup(table,$1));
};
%%
,在main例程中称为:
do{
yyparse();
}
问题是,它被正确解析,但只有第一个条目;也就是说,它没有从YYACCEPT中恢复。如何使代码在yyaccept之后再次调用yyparse ?
这几乎是同一个问题,我如何说服Bison解析文件的一部分?但是我没能解决我的问题。
您应该启用%debug
跟踪来检查正在发生的事情。此外,考虑到您正在尝试做的事情,您可能应该尝试推送解析器(http://www.gnu.org/software/bison/manual/html_node/Push-Decl.html)。