Files
japonca/okur.lisp

161 lines
5.3 KiB
Common Lisp
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
;;; **************************************************
;;;; 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) sıra)
(let (kanji kana anlam tür alttür)
(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 tür (sonraki-öbek okur '(#\Newline #\Space #\; #\,)))
(cond ((or (string= tür "fiil")
(string= tür "sıfat"))
(boşluk-geç okur)
(setf alttür (sonraki-öbek okur '(#\Newline #\Space #\;))))
((char= #\, (kar-bak okur))
(kar-oku okur)
(boşluk-geç okur)
(setf tür (list tür (sonraki-öbek okur '(#\Newline #\Space #\;)))))))
(make-instance 'kelime :kanji kanji :kana kana :anlam anlam
:tür tür :alttür alttür :sıra sıra)))
(defmethod işle ((okur okur))
(unless (eq :baş (durum okur))
(error "Okur zaten işlenmiş"))
(loop :with sıra := 0
: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 sıra)
(kelimeler okur))
(incf sıra))))
(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)))