Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

development of Namazu NG started!



次世代 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