0

朋友们,我正在解析一个 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:%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?

这几乎与如何说服 Bison 解析文件的一部分?但我没能解决我的问题。

4

1 回答 1

1

您应该启用%debug跟踪以检查正在发生的事情。此外,鉴于您正在尝试做的事情,您可能应该尝试推送解析器(http://www.gnu.org/software/bison/manual/html_node/Push-Decl.html)。

于 2013-04-10T07:27:34.177 回答