X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcql.y;h=d1d5d1baf687da4eba4fc3620b92c1208930c244;hp=67e2f761809ea7c6b9ca24053cd28515e831659e;hb=cd7c85097df2b7ccd4728e5911348b6e78ccf7f2;hpb=9084e20f4c5ffad9cfea2087396206b75a3a6654 diff --git a/src/cql.y b/src/cql.y index 67e2f76..d1d5d1b 100644 --- a/src/cql.y +++ b/src/cql.y @@ -56,7 +56,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 +145,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 +161,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 +201,7 @@ modifiers '/' searchTerm relation_symbol searchTerm } ; -relation: SIMPLE_STRING | relation_symbol; +relation: PREFIX_NAME | relation_symbol; relation_symbol: '=' @@ -206,6 +218,7 @@ index: searchTerm: SIMPLE_STRING +| PREFIX_NAME | AND | OR | NOT @@ -325,8 +338,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 +384,14 @@ int yylex(YYSTYPE *lval, void *vp) lval->buf = "sortby"; return SORTBY; } + 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; }