2013-04-09 3 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는 각 항목 후 반환 할, 따라서 내 파서는 다음과 같습니다

do{ 
    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)); 
       }; 

%% 

와 메인 루틴에서

, 그것은라고한다 그것은 정확하게 구문 분석되지만 첫 번째 항목 만 구문 분석합니다. 즉 YYACCEPT에서 복구되지 않고 있습니다. yyaccept 다음에 yyparse를 다시 호출하는 방법은 무엇입니까?

이것은 거의 같은 질문입니다. How do I convince Bison to parse part of a file? 그러나 문제를 해결하지 못했습니다.

+1

위의 내용은 올바른 것으로 보입니다 (C 구문을 기준으로). 'Entry'는 기본 감소가 있습니다. 어떤 방법으로 작동하지 않습니까? 물론'yyparse() '를 다시 호출하기 전에 전역 테이블을 리셋해야 할 것이다. 파서가 무엇을하는지에 대한 더 많은 정보를 얻으려면 yyparse를 호출하기 전에'-DYYDEBUG'로 컴파일하고'yydebug = 1'을 설정하십시오. –

+0

@ChrisDodd, 답장을 보내 주셔서 감사합니다. I 출력을 인쇄 할 경우, '$ ./parse : 책 제목 : "ASR" 제작사 : 저자 "OXF": {A {\ 'm} OOK, 루드라 얀 배너 지} 년도 : "2010" 주소 : "영국" 판 : "1" ' 모두 내가 제대로 첫 번째 항목을 구문 분석, 즉지고 있지만, 다음 항목으로 returnning하고 있지 않다 무엇 을 친절하게 도움이됩니다. – BaRud

답변

관련 문제