Namazu-devel-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
development of Namazu NG started!
- From: Satoru Takabayashi <satoru-t@xxxxxxxxxxxxxxxxxx>
- Date: Tue, 05 Sep 2000 11:35:49 +0900
- X-ml-name: namazu-devel-ja
- X-mail-count: 00773
次世代 Namazu の開発を始めました。
% cvs -d cvs.namazu.org:/storage/cvsroot co namazu-ng
で入手できます。今のところ scm/{lex,parse,query}.scm という
ファイルがあるだけです。
手始めに、検索式の字句解析 + 構文解析の処理を Scheme で書き
ました。
% guile -l query.scm
guile> (lex "foo | {foo bar} & (bar /b.a.z/ not quux*)")
((word . "foo") (op:or . "|") (phrase . "foo bar") (op:and . "&") (paren:l . "(") (word . "bar") (regex . "b.a.z") (op:not . "not") (word . "quux*") (paren:r . ")"))
guile> (expr (lex "foo | {foo bar} & (bar /b.a.z/ not quux*)"))
(op:or (word . "foo") (op:and (phrase . "foo bar") (op:and (word . "bar") (op:not (regex . "b.a.z") (word . "quux*")))))
この例では
"foo | {foo bar} & (bar /b.a.z/ not quux*)"
という検索式を字句解析 + 構文解析して
(op:or (word . "foo")
(op:and (phrase . "foo bar")
(op:and (word . "bar")
(op:not (regex . "b.a.z")
(word . "quux*")))))
という構文木を作っています。
Scheme で字句解析 + 構文解析の処理を書いたのは、新しい検索方
法を後から動的に追加できるようにするためです。
# lex + yacc を使うと、字句解析 + 構文解析の挙動がコンパイル
# 時に固定してしまう
query.scm では次のようにして字句解析と構文解析の規則を定義し
ています。後から簡単に規則を追加・変更できます。
;; Register lex rules: token name and its pattern.
(let ((safe-char "[^ \t&!|()]"))
(add-lex-rule! 'space "^[ \t]+")
(add-lex-rule! 'substr (string-append "^\\*" safe-char "+\\*"))
(add-lex-rule! 'prefix (string-append "^" safe-char "+\\*"))
(add-lex-rule! 'suffix (string-append "^\\*" safe-char "+"))
(add-lex-rule! 'word (string-append "^" safe-char "+"))
...
(add-lex-rule! 'op:and "^(&|and\\>)")
(add-lex-rule! 'op:not "^(!|not\\>)")
(add-lex-rule! 'op:or "^(\\||or\\>)")
(add-lex-rule! 'paren:l "^\\(")
(add-lex-rule! 'paren:r "^\\)"))
;; Register operators: operator name and its precedence.
(add-operator! 'op:or 1)
(add-operator! 'op:and 2)
(add-operator! 'op:not 3)
(set-default-operator! 'op:and)
念のため補足:
新しい Namazu には Schemeインタプリタ (libguile) を搭載しま
す。速度が要求される部分だけを Cで書いて残りを Scheme で書く
予定です。Scheme でばりばり拡張できる設計を目指しています。
gimp とか sawfish みたいな感じ。(sawfish は Schemeではないが)
-- Satoru Takabayashi