aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2004-02-17 07:35:31 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2004-02-17 07:35:31 +0000
commit71b7bf72c129f07f1cef978259c73aca9c6824b8 (patch)
tree79af90f573eccd7e5c840675cb2e8ed870a4feaf /src
parentb126867df82cf6d14eb62ea95fb8650d6431b3be (diff)
downloadellinika-71b7bf72c129f07f1cef978259c73aca9c6824b8.tar.gz
ellinika-71b7bf72c129f07f1cef978259c73aca9c6824b8.tar.bz2
Allow to specify topics covering several dictionary nodes.
git-svn-id: file:///home/puszcza/svnroot/ellinika/trunk@14 941c8c0f-9102-463b-b60b-cd22ce0e6858
Diffstat (limited to 'src')
-rw-r--r--src/gram.y59
-rw-r--r--src/input.l2
-rw-r--r--src/main.c8
-rw-r--r--src/trans.h18
4 files changed, 76 insertions, 11 deletions
diff --git a/src/gram.y b/src/gram.y
index c065bcf..cef0ee0 100644
--- a/src/gram.y
+++ b/src/gram.y
@@ -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;
diff --git a/src/main.c b/src/main.c
index 839f393..c779f7f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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, ...);

Return to:

Send suggestions and report system problems to the System administrator.