이 질문 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",
}
누군가 해시 테이블을 올바르게 채울 수있는 방법을 보여 주면 고맙겠습니다. 도와주세요. 당신은 단지 하나의 해시 테이블에 모든 데이터를 덤프하는 것처럼
해시 테이블의 해시 테이블에 대해 친절하게 설명 할 수 있습니까? – BaRud