« HTML + CSS で数式組版 (その10) | トップページ | HTML + CSS で数式組版 (その12) »

2009年3月29日 (日)

HTML + CSS で数式組版 (その11)

parse-string 関数の誤りの訂正。 キーワードを見つけたときにも、下降しないと駄目でした。横着な実装は、やはり使えないみたいです。

(defun parse-string (str se)
  (if (> (length str) 0)
      (let ((m (match-token str)))
        (let ((mb (car m))
              (me (cadr m))
              (spec (caddr m)))
        (if mb
            (let ((se2 (+ se me)))
              (cond
               ((eq spec 'key) ; 下降させる。
                (let ((keyargs
                       (parse-keyargs
                        (substring str (+ mb 1) me)
                        (substring str me) se2)))
                  (let ((se3 (parse-end keyargs)))
                    (cons keyargs
                          (parse-string
                           (substring str (- se3 se))
                           se3)))))
               ((eq spec 'argbegin)
                ; parse-args -> parse-arg
                (let ((arg (parse-arg (substring str me) se2)))
                  (let ((se3 (parse-end arg)))
                    (cons arg
                          (parse-string
                           (substring str (+ (- se3 se2) 1))
                           se3)))))
               ((eq spec 'argend)
                (cons (list spec se2 (substring str mb me)) nil))
               ((eq spec 'text)
                (cons (list spec se2 (substring str mb me))
                      (parse-string (substring str me) se2)))))
          (parse-string (substring str 1) (+ se 1)))))))

(defun parse-keyargs (kw str se)
  (let ((sym (find-keyword kw *keywords*)))
    (if (eq sym nil)
        (error (format nil "keyword ~A not found." kw))
      (list sym se
            (parse-args str se)))))

(defun parse-args (str se)
  (if (> (length str) 0)
      (let ((m (match-token str)))
        (let ((mb (car m))
              (me (cadr m))
              (spec (caddr m)))
        (if mb
            (let ((se2 (+ se me)))
              (cond
               ((eq spec 'argbegin)
                (let ((arg (parse-arg (substring str me) se2)))
                  (let ((se3 (parse-end arg)))
                    (cons arg
                          (parse-args
                           (substring str (+ (- se3 se2) 1))
                           se3)))))
               (t nil))))))))

(defun parse-arg (str se)
  (let ((succ (parse-string str se)))
    (if (eq succ nil)
        (list 'argbegin se (list (+ se 1) nil))
      (list 'argbegin se succ))))

|

« HTML + CSS で数式組版 (その10) | トップページ | HTML + CSS で数式組版 (その12) »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/28857323

この記事へのトラックバック一覧です: HTML + CSS で数式組版 (その11):

« HTML + CSS で数式組版 (その10) | トップページ | HTML + CSS で数式組版 (その12) »