2013-04-09 94 views
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?的問題幾乎是一樣的但我沒能解決我的問題。

+1

上面看起來正確(模C語法),並應該作爲'Entry'有一個默認的減少。它以什麼方式不起作用?當然,在再次調用'yyparse()'之前,您需要重置全局'表'。在調用yyparse之前,嘗試使用'-DYYDEBUG'編譯並設置'yydebug = 1'來獲取更多關於解析器正在做什麼的信息。 – 2013-04-09 16:32:47

+0

@ChrisDodd,謝謝你的回覆。 如果我打印輸出, '$ ./parse :書 名稱: 「ASR」 出版商: 「OXF」 作者:{A {\「M}的OOK,陀羅納吉} 年:「2010」 地址:「英國」 版:「1」 ' 是所有我所得到的,即它被正確解析中的第一項,但不returnning到下一個條目 請幫助。 – BaRud 2013-04-09 16:49:39

回答