diff options
Diffstat (limited to 'okur.lisp')
-rw-r--r-- | okur.lisp | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/okur.lisp b/okur.lisp new file mode 100644 index 0000000..3a76f05 --- /dev/null +++ b/okur.lisp @@ -0,0 +1,158 @@ +;;; ************************************************** +;;;; Kelimeler dosyasındaki tanımlı kelimeleri okuma * +;;; ************************************************** +(in-package :japonca) + +(defclass okur () + ((dosya :accessor dosya :initarg :dosya) + (metin :accessor metin) + (durum :accessor durum :initform :baş) + (i :accessor i :initform 0) + (kelimeler :accessor kelimeler + :initform (make-array 10 :adjustable t :fill-pointer 0)))) + +(defmethod metni-yükle ((okur okur)) + (setf (metin okur) + (dosya-metni-oku (dosya okur)))) + +(defmethod metin-bitti? ((okur okur)) + (eq :son (durum okur))) + +(defmethod ++kar ((okur okur)) + (incf (i okur)) + (if (array-in-bounds-p (metin okur) (i okur)) + (i okur) + (setf (durum okur) :son))) + +(defmethod kar++ ((okur okur)) + (let ((i (i okur))) + (++kar okur) + i)) + +(defmethod kar-oku ((okur okur)) + (unless (metin-bitti? okur) + (char (metin okur) (kar++ okur)))) + +(defmethod kar-bak ((okur okur)) + (char (metin okur) (i okur))) + +(defmethod boşluğa-kadar ((okur okur)) + (loop :until (or (metin-bitti? okur) + (char= #\Space (kar-bak okur))) + :do (++kar okur))) + +(defmethod boşluk-geç ((okur okur)) + (loop :until (metin-bitti? okur) + :do (let ((kar (kar-bak okur))) + (if (char= #\Space kar) + (kar-oku okur) + (return))))) + +(defmethod yeni-satıra-geç ((okur okur)) + (loop :until (metin-bitti? okur) + :do (let ((kar (kar-oku okur))) + (when (char= #\Newline kar) + (return))))) +;; (setf (durum okur) :yeni-satır) + +;; (defparameter +öbek-son-ch+ '(#\Space #\Newline #\; #\, #\、)) +(defmethod sonraki-öbek ((okur okur) son-kar) + (let ((baş (i okur))) + (loop :until (metin-bitti? okur) + :do (let ((kar (kar-bak okur))) + (if (find kar son-kar :test #'char=) + (loop-finish) + (++kar okur))) + :finally (loop :while (char= #\Space + (char (metin okur) + (- (i okur) 1))) + :do (decf (i okur)))) + (make-array (- (i okur) baş) + :element-type 'character + :displaced-to (metin okur) + :displaced-index-offset baş))) + +(defmethod kanji-oku ((okur okur)) + (let ((öbek (sonraki-öbek okur '(#\Space)))) + (unless (string= "-" öbek) + öbek))) + +(defmethod kana-oku ((okur okur)) + (let ((öbek (sonraki-öbek okur '(#\Space #\、)))) + (boşluk-geç okur) + (cons öbek + (when (char= #\、 (kar-bak okur)) + (kar-oku okur) + (boşluk-geç okur) + (kana-oku okur))))) + +(defmethod anlam-oku ((okur okur)) + (let ((öbek (sonraki-öbek okur '(#\, #\Newline #\; #\|)))) + (boşluk-geç okur) + (cons öbek + (when (and (not (metin-bitti? okur)) + (char= #\, (kar-bak okur))) + (kar-oku okur) + (boşluk-geç okur) + (anlam-oku okur))))) + +(defmethod kelime-oku ((okur okur)) + (let (kanji kana anlam grup altgrup) + (setf kanji (kanji-oku okur)) + (boşluk-geç okur) + (setf kana (kana-oku okur)) + (setf anlam (anlam-oku okur)) + (when (and (not (metin-bitti? okur)) + (char= #\| (kar-bak okur))) + ;; (yeni-satıra-geç okur) + (kar-oku okur) + (boşluk-geç okur) + (setf grup (sonraki-öbek okur '(#\Newline #\Space #\; #\,))) + (cond ((or (string= grup "fiil") + (string= grup "sıfat")) + (boşluk-geç okur) + (setf altgrup (sonraki-öbek okur '(#\Newline #\Space #\;)))) + ((char= #\, (kar-bak okur)) + (kar-oku okur) + (boşluk-geç okur) + (push (sonraki-öbek okur '(#\Newline #\Space #\;)) grup)))) + (make-instance 'kelime :kanji kanji :kana kana :anlam anlam + :grup grup :altgrup altgrup))) + +(defmethod işle ((okur okur)) + (unless (eq :baş (durum okur)) + (error "Okur zaten işlenmiş")) + (loop :until (metin-bitti? okur) + :do (case (kar-bak okur) + (#\; (yeni-satıra-geç okur)) + (#\Newline (yeni-satıra-geç okur)) + (#\Space (boşluk-geç okur)) + (otherwise (vector-push-extend (kelime-oku okur) + (kelimeler okur))))) + (kelimeler okur)) + +(defmacro okurla ((isim dosya-ismi) &body beden) + `(let ((,isim (make-instance 'okur :dosya ,dosya-ismi))) + ,@beden)) + +;; (defparameter *okur* nil) + +;; (defun test-okuru-yap () +;; (setf *okur* +;; (make-instance 'okur :dosya "/home/riton/projects/japonca/örnek.txt")) +;; (metni-yükle *okur*)) + + + +;; (buffer :accessor buffer :initform (make-array 1028 :element-type 'character +;; :fill-pointer 0)) + +;; (defmethod yeni-satır ((okur okur)) +;; (let* ((yeni-poz (position #\Newline (metin okur) :start (i okur))) +;; (fark (- yeni-poz (i okur)))) +;; (setf (fill-pointer (buffer okur)) fark) +;; (replace (buffer okur) (metin okur) +;; :start1 0 :end1 fark +;; :start2 (i okur) :end2 yeni-poz) +;; (setf (i okur) (+ yeni-poz 1)) +;; (buffer okur))) |