This commit is contained in:
riton
2025-02-11 23:03:13 +03:00
commit d683a2e52f
9 changed files with 694 additions and 0 deletions

158
okur.lisp Normal file
View File

@@ -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)))