Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在yyaccept之后恢复yyparse_C_Bison - Fatal编程技术网

在yyaccept之后恢复yyparse

在yyaccept之后恢复yyparse,c,bison,C,Bison,朋友们,我正在解析一个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"

朋友们,我正在解析一个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));
              };

%%
问题是,它被正确解析,但只解析了第一个条目;i、 e.它没有从故障中恢复。 我如何让代码在yyaccept之后再次调用yyparse


这与问题几乎相同,但我没有解决问题。

您应该启用
%debug
跟踪来检查发生了什么。另外,考虑到您正在尝试做的事情,您可能应该尝试推送解析器()。

上面的内容看起来是正确的(模C语法),并且应该可以工作,因为
条目
有一个默认的缩减。它以什么方式不起作用?当然,在再次调用
yyparse()
之前,您需要重置全局
表。在调用yyparse之前,请尝试使用
-DYYDEBUG
编译并设置
yydebug=1
,以获取有关解析器正在执行的操作的详细信息。@chrisdd,感谢您的回复。如果我打印输出,
$。/parse:Book Title:“ASR”Publisher:“oxf”作者:{a{“m}ook,Rudra Banerjee}年份:“2010”地址:“UK”版本:“1”
就是我得到的全部,也就是说,它正确解析了第一个条目,但没有返回到下一个条目。请帮助
do{
   yyparse();
  }