2013-03-29 2 views
0

이 질문 flex+bison output in a glib's hash container 의 토론 (마지막 게시물이 일부 논의 후 답이 남아 있었다.) 나는 플렉스 및 들소를 사용하여 BibTex 파일을 구문 분석 할 내가 그것을 다시 게시하자 다음, gtk 라이브러리 (C 언어)를 사용하여 해당 데이터를 표시합니다. 렉서는프로세스 플렉스 + 들소 출력

%{ 
#include "bib.tab.h" 
%} 

%% 
[A-Za-z][A-Za-z0-9]*  { yylval.sval = strdup(yytext); return KEY; } 
\"([^\"]|\\.)*\"|\{([^\"]|\\.)*\} { yylval.sval = strdup(yytext); return VALUE; } 
[ \t\n]     ; /* ignore whitespace */ 
[{}@=,]     { return *yytext; } 
.       { fprintf(stderr, "Unrecognized character %c in input\n", *yytext); } 
%% 

하고 파서입니다 : 사람들이 내 최종 목표를 볼 수 있도록

%{ 
#include <stdio.h> 
#include <glib.h> 
#include <gtk/gtk.h> 
#include <string.h> 
#include <glib/gstdio.h> 
#include <fcntl.h> 
enum 
{ 
    COL_BIB_KEY=0, 
    COL_BIB_TYPE, COL_BIB_AUTHOR, COL_BIB_YEAR, 
    NUM_COLS} ; 
#define slen 1024 
GHashTable* table; 
GtkTreeIter siter; 
GtkListStore *store; 
%} 

// Symbols. 
%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 '}' 
    ; 
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); 
       }; 

%% 

int yyerror(char *s) { 
    printf("yyerror : %s\n",s); 
} 

int main(int argc, char** argv) { 
gtk_init(&argc, &argv); 
GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);  
    GtkWidget *tree=gtk_tree_view_new(); 
    setup_tree(tree); 

gtk_container_add (GTK_CONTAINER (window), tree); 
store= gtk_list_store_new (NUM_COLS, 
     G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); 
    table = g_hash_table_new(g_str_hash, g_str_equal); 
gint i; 
do{ 
    g_hash_table_remove_all (table); 
    yyparse(); 
    parse_entry (table); 
gtk_tree_view_set_model (GTK_TREE_VIEW (tree), GTK_TREE_MODEL (store)); 
g_object_unref (store); 
    } 
    while(!EOF); 
    g_hash_table_destroy (table); 
gtk_widget_show_all (window); 
gtk_main(); 
return 0; 
} 
void parse_entry (GHashTable *table) 
{ 
    GHashTableIter iter; 
    gchar *key, *val; 
    char *keys[] = {"id", "type", "author", "year", "title", "publisher", "editor", 
    "volume", "number", "pages", "month", "note", "address", "edition", "journal", 
    "series", "book", "chapter", "organization", NULL}; 
    char *vals[] = {NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL, 
    NULL, NULL, NULL, NULL, NULL}; 

    gchar **kiter; 
    gint i; 
    g_hash_table_iter_init (&iter, table); 
    while (g_hash_table_iter_next (&iter, (void **)&key, (void **)&val)) 
    { 
    for (kiter = keys, i = 0; *kiter; kiter++, i++) 
    { 
     if (!g_ascii_strcasecmp(*kiter, key)) 
     { 
    vals[i] = g_strndup(val,slen); 
// g_printf("%s:%s\n",keys[i],g_hash_table_lookup(table,keys[i])); 
    g_printf("%d=>%s:%s\n",i,keys[i],vals[i]); 
    break; 
     } 
    } 
    } 
    gtk_list_store_append (store, &siter); 
    gtk_list_store_set (store, &siter, 
     COL_BIB_TYPE,   vals[COL_BIB_TYPE], 
     COL_BIB_KEY,  vals[COL_BIB_KEY], 
     COL_BIB_AUTHOR,  vals[COL_BIB_AUTHOR], 
     COL_BIB_YEAR,   vals[COL_BIB_YEAR], 
     -1); 
} 

void setup_tree(GtkWidget *tree){ 
GtkCellRenderer *renderer; 
GtkTreeViewColumn *column; 

renderer = gtk_cell_renderer_text_new(); 
column = gtk_tree_view_column_new_with_attributes 
("Type", renderer, "text",COL_BIB_TYPE , NULL); 
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); 
renderer = gtk_cell_renderer_text_new(); 
column = gtk_tree_view_column_new_with_attributes 
("Author", renderer, "text", COL_BIB_AUTHOR, NULL); 
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); 
renderer = gtk_cell_renderer_text_new(); 
column = gtk_tree_view_column_new_with_attributes 
("Year", renderer, "text",COL_BIB_YEAR, NULL); 
gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column); 
g_printf("HIIIIIIIIIi"); 
} 

문제는 해시 테이블을 채우기에, 그리고 목록보기 (I 목록 저장소를 동봉 개선을 권장합니다.) 을 우리가 행 번호 50 라인

g_printf("%s:%s\n",$1,g_hash_table_lookup(table,$1)); 

를 넣어 경우, 올바르게 해시 테이블의 내용을 인쇄, 그러나 우리는 conten를 원하는 경우 t 행 번호 105의 주석 처리를 제거하면 마지막 항목 만 구문 분석됩니다. 그래서, 내 생각 엔 내가 제대로 해시 파일을 처리하지 오전 (더 97-107 될 수 없다 라인?)

메이크 파일은 다음과 같습니다

CC=gcc -g 
FLEX=flex 
BISON=bison 
LIBS=lfl 
PROG=parse 

${PROG}:bib.y bib.l 
    ${BISON} -d bib.y 
    ${FLEX} -i bib.l 
    ${CC} lex.yy.c bib.tab.c `pkg-config --cflags --libs glib-2.0``pkg-config --cflags --libs gtk+-3.0` -${LIBS} -o [email protected] 

clean: 
    rm -f lex.yy.c bib.tab.c ${PROG} 
    touch bib.l bib.y 

및 샘플하여 BibTex 파일은 다음과 같습니다

@Book{a1, 
    Title="ASR", 
    Publisher="oxf", 
    author = "a {\"m}ook, Rudra Banerjee", 
    Year="2010", 
    Address="UK", 
    Edition="1", 
} 
@Booklet{ab19, 
    Author="Rudra Banerjee and A. Mookerjee", 
    Title="Fe{\"Ni}Mo", 
    Editor="sm1", 
    Title="sm2", 
    Publisher="sm3", 
    Volume="sm4", 
    Number="sm5", 
    Pages="sm6", 
    Month="sm8", 
    Note="sm9", 
    Key="sm10", 
    Year="1980", 
    Address="osm1", 
    Edition="osm2", 
} 

누군가 해시 테이블을 올바르게 채울 수있는 방법을 보여 주면 고맙겠습니다. 도와주세요. 당신은 단지 하나의 해시 테이블에 모든 데이터를 덤프하는 것처럼

답변

0

는 것 같습니다. 첫 번째 항목은 해시 테이블로 이동하여 TYPE, ID, Title, Publisher 등의 키를 뺍니다. 두 번째 항목은 author 대신 Author을 사용하는 것을 제외하고는 동일한 키와 값을 덮어 씁니다. 2 개의 입장.

해시 테이블을 사용하려는 경우 각 항목에 해시 테이블이 필요하고 해당 항목에 대한 정보가 들어있는 해시 테이블에 ID를 매핑하는 해시 테이블이 필요합니다. 또는 각 항목을 목록이나 다른 컨테이너 구조로 구문 분석하고 ID/목록에 ID를 매핑하는 단일 해시 테이블을 가질 수 있습니다.

KEY 또는 VALUE에 대해 새 메모리를 할당하고 해시 테이블에 넣기 위해 메모리를 복제하면 메모리가 매우 빨리 새어 나옵니다.

+0

해시 테이블의 해시 테이블에 대해 친절하게 설명 할 수 있습니까? – BaRud