diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gram.y | 59 | ||||
-rw-r--r-- | src/input.l | 2 | ||||
-rw-r--r-- | src/main.c | 8 | ||||
-rw-r--r-- | src/trans.h | 18 |
4 files changed, 76 insertions, 11 deletions
@@ -7,7 +7,9 @@ struct obstack stk; struct descr *make_descr(enum descr_type type, u_char *value); - + +static int _register_topic(void *item, void *data); + %} %token NODE POS END MEANING ALIAS ANT TOPIC FORMS XREF @@ -16,28 +18,65 @@ struct descr *make_descr(enum descr_type type, u_char *value); %type <string> string pos forms %type <header> nodehdr alias %type <descr> descr -%type <list> aliases descrlist header +%type <list> list aliases descrlist header +%type <item> item %union { u_char *string; struct header *header; struct descr *descr; RAD_LIST *list; + struct gram_item item; }; %% input : list + { + node_list = $1; + } ; -list : node - | list node +list : item + { + $$ = list_create(); + switch ($1.type) { + case item_node: + list_append($$, $1.v.node); + break; + + case item_list: + list_concat($$, $1.v.list); + list_destroy(&$1.v.list, NULL, NULL); + } + } + | list item + { + switch ($2.type) { + case item_node: + list_append($1, $2.v.node); + break; + + case item_list: + list_concat($1, $2.v.list); + list_destroy(&$2.v.list, NULL, NULL); + } + $$ = $1; + } ; -node : header descrlist end +item : header descrlist end + { + $$.type = item_node; + $$.v.node = create_node($1, $2); + } + | TOPIC string list end { - register_node($1, $2); + $$.type = item_list; + $$.v.list = $3; + list_iterate($3, _register_topic, + make_descr(descr_topic, $2)); } ; @@ -179,3 +218,11 @@ make_descr(enum descr_type type, u_char *value) p->value = value; return p; } + +static int +_register_topic(void *item, void *data) +{ + struct node *node = item; + list_append(node->descr, data); + return 0; +} diff --git a/src/input.l b/src/input.l index 542c897..4cb7112 100644 --- a/src/input.l +++ b/src/input.l @@ -14,7 +14,7 @@ WS [ \t]+ #.*\n input_line++; ^[nN][oO][dD][eE] return NODE; ^[pP][oO][sS] return POS; -^[eE][nN][dD] return END; +^[eE][nN][dD]{MWS} return END; ^[mM][eE][aA][nN][iI][nN][gG] return MEANING; ^[aA][lL][iI][aA][sS] return ALIAS; ^[aA][nN][tT] return ANT; @@ -28,10 +28,10 @@ efree(void *ptr) free(ptr); } -static RAD_LIST *node_list; +RAD_LIST *node_list; -void -register_node(RAD_LIST *hdr, RAD_LIST *descr) +struct node * +create_node(RAD_LIST *hdr, RAD_LIST *descr) { struct node *node = emalloc(sizeof(*node)); struct header *prev = NULL; @@ -56,7 +56,7 @@ register_node(RAD_LIST *hdr, RAD_LIST *descr) } node->header = hdr; node->descr = descr; - list_append(node_list, node); + return node; } diff --git a/src/trans.h b/src/trans.h index 4b6b35a..7c38227 100644 --- a/src/trans.h +++ b/src/trans.h @@ -8,6 +8,19 @@ extern char *file_name; extern int input_line; +enum gram_item_type { + item_node, + item_list +}; + +struct gram_item { + enum gram_item_type type; + union { + RAD_LIST *list; + struct node *node; + } v; +}; + struct header { u_char *key; char *pos; @@ -36,6 +49,11 @@ struct xref { u_char *value; }; +extern RAD_LIST *node_list; + +extern struct node *create_node(RAD_LIST *hdr, RAD_LIST *descr); + + void open_input(char *name); int sql_query(char *fmt, ...); int sql_query_n(unsigned long *pret, char *fmt, ...); |