SRW, CQL, 2003
[yaz-moved-to-github.git] / cql / lexer.c
1 /* $Id: lexer.c,v 1.1 2003-01-06 08:20:27 adam Exp $
2    Copyright (C) 2002-2003
3    Index Data Aps
4
5 This file is part of the YAZ toolkit.
6
7 See the file LICENSE.
8 */
9 /*
10  * bison lexer for CQL.
11  */
12
13 int yylex(YYSTYPE *lval, void *vp)
14 {
15     CQL_parser cp = (CQL_parser) vp;
16     int c;
17     do
18     {
19         c = cp->getbyte(cp->client_data);
20         if (c == 0)
21             return 0;
22         if (c == '\n')
23             return 0;
24     } while (isspace(c));
25     lval->rel = 0;
26     lval->len = 0;
27     if (strchr("()=></", c))
28     {
29         int c1;
30         lval->buf[lval->len++] = c;
31         if (c == '>')
32         {
33             c1 = cp->getbyte(cp->client_data);
34             if (c1 == '=')
35             {
36                 lval->buf[lval->len++] = c1;
37                 lval->buf[lval->len] = 0;
38                 return GE;
39             }
40             else
41                 cp->ungetbyte(c1, cp->client_data);
42         }
43         else if (c == '<')
44         {
45             c1 = cp->getbyte(cp->client_data);
46             if (c1 == '=')
47             {
48                 lval->buf[lval->len++] = c1;
49                 lval->buf[lval->len] = 0;
50                 return LE;
51             }
52             else if (c1 == '>')
53             {
54                 lval->buf[lval->len++] = c1;
55                 lval->buf[lval->len] = 0;
56                 return NE;
57             }
58             else
59                 cp->ungetbyte(c1, cp->client_data);
60         }
61         lval->buf[lval->len] = 0;
62         return c;
63     }
64     if (c == '"')
65     {
66         while ((c = cp->getbyte(cp->client_data)) != EOF && c != '"')
67         {
68             if (c == '\\')
69                 c = cp->getbyte(cp->client_data);
70             lval->buf[lval->len++] = c;
71         }
72         lval->buf[lval->len] = 0;
73     }
74     else
75     {
76         lval->buf[lval->len++] = c;
77         while ((c = cp->getbyte(cp->client_data)) != 0 &&
78                !strchr(" \n()=<>/", c))
79         {
80             if (c == '\\')
81                 c = cp->getbyte(cp->client_data);
82             lval->buf[lval->len++] = c;
83         }
84         lval->buf[lval->len] = 0;
85 #if YYDEBUG
86         printf ("got %s\n", lval->buf);
87 #endif
88         if (c != 0)
89             cp->ungetbyte(c, cp->client_data);
90         if (!strcmp(lval->buf, "and"))
91             return AND;
92         if (!strcmp(lval->buf, "or"))
93             return OR;
94         if (!strcmp(lval->buf, "not"))
95             return NOT;
96         if (!strcmp(lval->buf, "exact"))
97             return EXACT;
98         if (!strcmp(lval->buf, "all"))
99             return ALL;
100         if (!strncmp(lval->buf, "prox", 4))
101             return PROX;
102         if (!strcmp(lval->buf, "any"))
103             return ANY;
104         if (!strcmp(lval->buf, "scr"))
105             return SCR;
106     }
107     return TERM;
108 }