X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcql.y;h=5af8777fcd0a56a9be6f6e2a4b31a490ea0260db;hp=67e2f761809ea7c6b9ca24053cd28515e831659e;hb=5ae2f74ba9b27bb7e926d5908471ac79371f7823;hpb=9084e20f4c5ffad9cfea2087396206b75a3a6654 diff --git a/src/cql.y b/src/cql.y index 67e2f76..5af8777 100644 --- a/src/cql.y +++ b/src/cql.y @@ -44,6 +44,7 @@ int last_pos; struct cql_node *top; NMEM nmem; + int strict; }; #define YYSTYPE token @@ -56,7 +57,7 @@ %} %pure_parser -%token SIMPLE_STRING AND OR NOT PROX GE LE NE EXACT SORTBY +%token PREFIX_NAME SIMPLE_STRING AND OR NOT PROX GE LE NE EXACT SORTBY %% @@ -145,12 +146,12 @@ searchClause: $$.cql = $3.cql; } | -searchTerm { +searchTerm extraTerms { struct cql_node *st = cql_node_dup(((CQL_parser) parm)->nmem, $0.rel); + st->u.st.extra_terms = $2.cql; st->u.st.term = nmem_strdup(((CQL_parser)parm)->nmem, $1.buf); $$.cql = st; } - | index relation modifiers { $$.rel = cql_node_mk_sc(((CQL_parser) parm)->nmem, $1.buf, $2.buf, 0); @@ -161,6 +162,18 @@ searchTerm { } ; +extraTerms: +SIMPLE_STRING extraTerms { + struct cql_node *st = cql_node_mk_sc(((CQL_parser) parm)->nmem, + /* index */ 0, /* rel */ 0, $1.buf); + st->u.st.extra_terms = $2.cql; + $$.cql = st; +} +| +{ $$.cql = 0; } +; + + /* unary NOT search SIMPLE_STRING here .. */ boolean: @@ -189,7 +202,7 @@ modifiers '/' searchTerm relation_symbol searchTerm } ; -relation: SIMPLE_STRING | relation_symbol; +relation: PREFIX_NAME | relation_symbol; relation_symbol: '=' @@ -206,6 +219,7 @@ index: searchTerm: SIMPLE_STRING +| PREFIX_NAME | AND | OR | NOT @@ -325,8 +339,11 @@ int yylex(YYSTYPE *lval, void *vp) } else { + int relation_like = 0; while (c != 0 && !strchr(" \n()=<>/", c)) { + if (c == '.') + relation_like = 1; if (c == '\\') { putb(lval, cp, c); @@ -368,6 +385,16 @@ int yylex(YYSTYPE *lval, void *vp) lval->buf = "sortby"; return SORTBY; } + if (cp->strict) + return PREFIX_NAME; + if (!cql_strcmp(lval->buf, "all")) + relation_like = 1; + if (!cql_strcmp(lval->buf, "any")) + relation_like = 1; + if (!cql_strcmp(lval->buf, "adj")) + relation_like = 1; + if (relation_like) + return PREFIX_NAME; } return SIMPLE_STRING; } @@ -400,6 +427,7 @@ CQL_parser cql_parser_create(void) cp->last_error = 0; cp->last_pos = 0; cp->nmem = nmem_create(); + cp->strict = 0; return cp; } @@ -415,6 +443,11 @@ struct cql_node *cql_parser_result(CQL_parser cp) return cp->top; } +void cql_parser_strict(CQL_parser cp, int mode) +{ + cp->strict = mode; +} + /* * Local variables: * c-basic-offset: 4