⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cql.y

📁 harvest是一个下载html网页得机器人
💻 Y
字号:
/* $Id: cql.y,v 1.6 2003/09/04 18:13:39 adam Exp $   Copyright (C) 2002-2003   Index Data ApsThis file is part of the YAZ toolkit.See the file LICENSE. bison parser for CQL grammar.*/%{#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <yaz/nmem.h>#include <yaz/cql.h>        typedef struct {        struct cql_node *rel;        struct cql_node *cql;        char *buf;        size_t len;        size_t size;    } token;            struct cql_parser {        int (*getbyte)(void *client_data);        void (*ungetbyte)(int b, void *client_data);        void *client_data;        int last_error;        int last_pos;        struct cql_node *top;        NMEM nmem;    };#define YYSTYPE token    #define YYPARSE_PARAM parm#define YYLEX_PARAM parm        int yylex(YYSTYPE *lval, void *vp);    int yyerror(char *s);%}%pure_parser%token TERM AND OR NOT PROX GE LE NE%expect 8%%top: {     $$.rel = cql_node_mk_sc("srw.serverChoice", "scr", 0);    ((CQL_parser) parm)->top = 0;} cqlQuery1 {    cql_node_destroy($$.rel);    ((CQL_parser) parm)->top = $2.cql; };cqlQuery1: cqlQuery| cqlQuery error {    cql_node_destroy($1.cql);    $$.cql = 0;};cqlQuery:   searchClause|  cqlQuery boolean {       $$.rel = $0.rel;   } searchClause {      struct cql_node *cn = cql_node_mk_boolean($2.buf);            cn->u.boolean.modifiers = $2.rel;      cn->u.boolean.left = $1.cql;      cn->u.boolean.right = $4.cql;      $$.cql = cn;  };searchClause:   '(' {       $$.rel = $0.rel;        } cqlQuery ')' {      $$.cql = $3.cql;  }|  searchTerm {      struct cql_node *st = cql_node_dup ($0.rel);      st->u.st.term = strdup($1.buf);      $$.cql = st;  }|   index relation {      $$.rel = $2.rel;      $$.rel->u.st.index = strdup($1.buf);  } searchClause {      $$.cql = $4.cql;      cql_node_destroy($2.rel);  }| '>' searchTerm '=' searchTerm {      $$.rel = $0.rel;  } cqlQuery {    $$.cql = cql_node_prefix($6.cql, $2.buf, $4.buf);  }| '>' searchTerm {      $$.rel = $0.rel;  } cqlQuery {    $$.cql = cql_node_prefix($4.cql, 0, $2.buf);   };/* unary NOT search TERM here .. */boolean:   AND | OR | NOT | PROX proxqualifiers {      $$ = $1;      $$.rel = $2.rel;  }  ;proxqualifiers:   Prelation {       $$.rel = cql_node_mk_proxargs ($1.buf, 0, 0, 0);  }|  PrelationO Pdistance {      $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, 0, 0);  }|  PrelationO PdistanceO Punit {      $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, $3.buf, 0);  }|  PrelationO PdistanceO PunitO Pordering {      $$.rel = cql_node_mk_proxargs ($1.buf, $2.buf, $3.buf, $4.buf);  }|{ $$.rel = 0; };Punit: '/' searchTerm {       $$ = $2;   };PunitO: '/' searchTerm {      $$ = $2;   } | '/' { $$.buf[0] = 0; };Prelation: '/' baseRelation {    $$ = $2;};PrelationO: '/' baseRelation {    $$ = $2;}| '/' { $$.buf[0] = 0; };Pdistance: '/' searchTerm {     $$ = $2;};PdistanceO: '/' searchTerm {    $$ = $2;}| '/' { $$.buf[0] = 0; };Pordering: '/' searchTerm {     $$ = $2;};relation: baseRelation modifiers {    struct cql_node *st = cql_node_mk_sc(/* index */ 0,                                          /* relation */ $1.buf,                                          /* term */ 0);    st->u.st.modifiers = $2.cql;    $$.rel = st;};modifiers: '/' searchTerm modifiers{     struct cql_node *mod = cql_node_mk_mod(0, $2.buf);    mod->u.mod.next = $3.cql;    $$.cql = mod;}|  {     $$.cql = 0;};baseRelation:   '=' | '>' | '<'| GE| LE| NE| TERM;index:   searchTerm;searchTerm:  TERM| AND| OR| NOT| PROX;%%int yyerror(char *s){    return 0;}#include "lexer.c"int cql_parser_stream(CQL_parser cp,                      int (*getbyte)(void *client_data),                      void (*ungetbyte)(int b, void *client_data),                      void *client_data){    cp->getbyte = getbyte;    cp->ungetbyte = ungetbyte;    cp->client_data = client_data;    if (cp->top)        cql_node_destroy(cp->top);    cql_parse(cp);    if (cp->top)        return 0;    return -1;}CQL_parser cql_parser_create(void){    CQL_parser cp = (CQL_parser) malloc (sizeof(*cp));    cp->top = 0;    cp->getbyte = 0;    cp->ungetbyte = 0;    cp->client_data = 0;    cp->last_error = 0;    cp->last_pos = 0;    cp->nmem = nmem_create();    return cp;}void cql_parser_destroy(CQL_parser cp){    cql_node_destroy(cp->top);    nmem_destroy(cp->nmem);    free (cp);}struct cql_node *cql_parser_result(CQL_parser cp){    return cp->top;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -