From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.emacs.gnus.general/53806 Path: main.gmane.org!not-for-mail From: kai.grossjohann@gmx.net (=?iso-8859-1?q?Kai_Gro=DFjohann?=) Newsgroups: gmane.emacs.gnus.general Subject: Re: Fledgling project nnsearch.el Date: Sun, 24 Aug 2003 19:22:47 +0200 Organization: University of Duisburg, Germany Sender: ding-owner@lists.math.uh.edu Message-ID: <84vfsn3r88.fsf@slowfox.is.informatik.uni-duisburg.de> References: <841xvbb03m.fsf@slowfox.is.informatik.uni-duisburg.de> <848ypj5cjg.fsf@slowfox.is.informatik.uni-duisburg.de> <84znhz3sep.fsf@slowfox.is.informatik.uni-duisburg.de> NNTP-Posting-Host: deer.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: sea.gmane.org 1061745784 13918 80.91.224.253 (24 Aug 2003 17:23:04 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Sun, 24 Aug 2003 17:23:04 +0000 (UTC) Original-X-From: ding-owner+M2346@lists.math.uh.edu Sun Aug 24 19:23:02 2003 Return-path: Original-Received: from malifon.math.uh.edu ([129.7.128.13]) by deer.gmane.org with esmtp (Exim 3.35 #1 (Debian)) id 19qyZy-0006HH-00 for ; Sun, 24 Aug 2003 19:23:02 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.math.uh.edu) by malifon.math.uh.edu with smtp (Exim 3.20 #1) id 19qyZq-00037A-00; Sun, 24 Aug 2003 12:22:54 -0500 Original-Received: from sclp3.sclp.com ([64.157.176.121]) by malifon.math.uh.edu with smtp (Exim 3.20 #1) id 19qyZl-000375-00 for ding@lists.math.uh.edu; Sun, 24 Aug 2003 12:22:49 -0500 Original-Received: (qmail 80543 invoked by alias); 24 Aug 2003 17:22:49 -0000 Original-Received: (qmail 80538 invoked from network); 24 Aug 2003 17:22:49 -0000 Original-Received: from quimby.gnus.org (80.91.224.244) by sclp3.sclp.com with SMTP; 24 Aug 2003 17:22:49 -0000 Original-Received: from news by quimby.gnus.org with local (Exim 3.12 #1 (Debian)) id 19qyeu-0000mN-00 for ; Sun, 24 Aug 2003 19:28:08 +0200 Original-To: ding@gnus.org Original-Path: not-for-mail Original-Newsgroups: gnus.ding Original-Lines: 109 Original-NNTP-Posting-Host: pd951f940.dip.t-dialin.net Original-X-Trace: quimby.gnus.org 1061746088 2553 217.81.249.64 (24 Aug 2003 17:28:08 GMT) Original-X-Complaints-To: usenet@quimby.gnus.org Original-NNTP-Posting-Date: 24 Aug 2003 17:28:08 GMT Mail-Copies-To: never User-Agent: Gnus/5.1003 (Gnus v5.10.3) Emacs/21.3.50 (gnu/linux) Cancel-Lock: sha1:IpmKHlIZ5fz8LcIrgEbsPV8Nw8k= Precedence: bulk Xref: main.gmane.org gmane.emacs.gnus.general:53806 X-Report-Spam: http://spam.gmane.org/gmane.emacs.gnus.general:53806 --=-=-= I think I have it: --=-=-= Content-Type: application/emacs-lisp Content-Disposition: inline (defun nnsearch-parse-query (query) "Given a query string, return a parsed representation. The query string syntax is as follows: Query ::= Term | Term \"and\" Query | Term \"or\" Query | Term \"not\" Query | \"(\" Query \")\" Term ::= Word | Field \":\" Word Word ::= { a string of letters } Field ::= { name of mail header } Searching is case-insensitive. This function returns a Lisp representation of such a query, as follows: Query ::= Term | \"(and \" Query \" \" Query \")\" | \"(or \" Query \" \" Query \")\" | \"(not \" Query \" \" Query \")\" Term ::= Word | \"(field \" Field \" \" Word \")\" Word ::= { string of letters surrounded by double quotes } Field ::= { string of letters surrounded by double quotes }" (with-temp-buffer (insert query) (goto-char (point-min)) (nnsearch-qpars-query))) (defun nnsearch-qpars-token () "Return next token at point. Advance point over token. Skips whitespace before token." (nnsearch-qpars-ws) (cond ((eobp) 'eof) ((looking-at "(") (forward-char 1) 'open-paren) ((looking-at ")") (forward-char 1) 'close-paren) ((looking-at ":") (forward-char 1) 'colon) ((looking-at "\"") (read (current-buffer))) ((looking-at "and\\|or\\|not") (read (current-buffer))) (t (buffer-substring (point) (progn (skip-syntax-forward "^-.") (point)))))) (defun nnsearch-qpars-query () (let ((term (nnsearch-qpars-term)) (tok (save-excursion (nnsearch-qpars-token)))) (if (memq tok '(and or not)) (list (nnsearch-qpars-token) term (nnsearch-qpars-query)) term))) (defun nnsearch-qpars-close-paren () (let ((tok (nnsearch-qpars-token))) (unless (eq tok 'close-paren) (error "Query parse error, expected close paren but got %s" tok)))) (defun nnsearch-qpars-term () (if (eq (save-excursion (nnsearch-qpars-token)) 'open-paren) (let ((open (nnsearch-qpars-token)) (query (nnsearch-qpars-query)) (close (nnsearch-qpars-token))) (unless (eq close 'close-paren) (error "Expected close paren, got %s" close)) query) (let ((w (nnsearch-qpars-token)) (tok (save-excursion (nnsearch-qpars-token)))) (if (not (eq tok 'colon)) w (nnsearch-qpars-token) ;gobble colon (list 'field w (nnsearch-qpars-token)))))) (defun nnsearch-qpars-ws () (skip-syntax-forward "-")) --=-=-= Content-Disposition: inline -- Two cafe au lait please, but without milk. --=-=-=--