public void duzyaziOzelDurumOku(Kok kok, String okunanIcerik, String[] parcalar) { for (int i = 2; i < parcalar.Length; i++) { String _ozelDurum = parcalar[i]; //kisaltma ozel durumunun analizi burada yapiliyor. if (_ozelDurum.StartsWith(TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI.KisaAd)) { int loc = _ozelDurum.IndexOf(':'); if (loc > 0) { String parca = _ozelDurum.Substring(loc + 1); char sonSesli = parca[0]; if (!alfabe.harf(sonSesli).sesliMi()) { logger.Warn("Hatali kisaltma harfi.. Sesli bekleniyordu." + _ozelDurum); } kok.KisaltmaSonSeslisi = sonSesli; if (parca.Length > 1) { kok.ozelDurumEkle(ozelDurumlar[TurkceKokOzelDurumTipi.KISALTMA_SON_SESSIZ]); } else { kok.ozelDurumCikar(TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI); } } else { char sonHarf = kok.icerik()[kok.icerik().Length - 1]; if (!alfabe.harf(sonHarf).sesliMi()) { kok.KisaltmaSonSeslisi = 'e'; kok.ozelDurumEkle(ozelDurumlar[TurkceKokOzelDurumTipi.KISALTMA_SON_SESLI]); } } continue; } //diger ozel durumlarin elde edilmesi.. KokOzelDurumu oz = ozelDurum(_ozelDurum); if (oz != null) { kok.ozelDurumEkle(oz); } else { logger.Warn("Hatali kok bileseni" + kok.icerik() + " Token: " + _ozelDurum); } } //kisaltmalari ve ozel karakter iceren kokleri asil icerik olarak ata. if (kok.tip() == KelimeTipi.KISALTMA || kok.ozelDurumIceriyormu(TurkceKokOzelDurumTipi.OZEL_IC_KARAKTER)) { kok.Asil = okunanIcerik; } }
/** * İkili (Binary) sözlükten bir kök okur. çağrıldıkça bir sonraki kökü alır. * * @return bir sonraki kök. Eğer okunacak kök kalmamışsa null */ public Kok oku() { String icerik = string.Empty; //kok icerigini oku. eger dosya sonuna gelinmisse (EndOfStreamException) null dondur. try { int len = binReader.ReadByte() * 255 + binReader.ReadByte(); icerik = Encoding.UTF8.GetString(binReader.ReadBytes(len)); } catch (EndOfStreamException) { this.Kapat(); return(null); } int len1 = binReader.ReadByte() * 255 + binReader.ReadByte(); String asil = Encoding.UTF8.GetString(binReader.ReadBytes(len1)); // Tip bilgisini oku (1 byte) string tipstr = binReader.ReadByte().ToString(); KelimeTipi tip = (KelimeTipi)Enum.Parse(typeof(KelimeTipi), tipstr); Kok kok = new Kok(icerik, tip); if (asil.Length != 0) { kok.Asil = asil; } char c = Encoding.UTF8.GetChars(binReader.ReadBytes(2))[0]; if (char.IsLetter(c)) { kok.KisaltmaSonSeslisi = c; } // Özel durum sayısını (1 byte) ve ozel durumlari oku. int ozelDurumSayisi = binReader.ReadByte(); for (int i = 0; i < ozelDurumSayisi; i++) { int ozelDurum = binReader.ReadByte(); KokOzelDurumu oz = ozelDurumlar.ozelDurum(ozelDurum); kok.ozelDurumEkle(oz); } int frekans = binReader.ReadByte() * 255 * 255 * 255 + binReader.ReadByte() * 255 * 255 + binReader.ReadByte() * 255 + binReader.ReadByte(); if (frekans != 0) { kok.Frekans = frekans; } return(kok); }
/// <summary> sadece ilk acilista kullanilan bir metod /// /// </summary> /// <param name="tip"> /// </param> public virtual void ozelDurumCikar(KokOzelDurumTipi tip) { if (!ozelDurumIceriyormu(tip)) { return; } KokOzelDurumu[] yeni = new KokOzelDurumu[ozelDurumlar.Length - 1]; int j = 0; foreach (KokOzelDurumu oz in ozelDurumlar) { if (!oz.tip().Equals(tip)) { yeni[j++] = oz; } } this.ozelDurumlar = yeni; }
/// <summary> koke ozel durum ekler. burada dizi kullaniminda kaynak konusunda cimrilik ettigimizden /// her yeni ozel durum icin dizi boyutunu bir buyuttuk. ayrica tekrar olmamasini da sagliyoruz. /// Normalde bu islem Set icin c*k daha kolay bir yapida olabilirdi set.add() ancak Set'in kaynak tuketimi /// diziden daha fazla. /// /// </summary> /// <param name="ozelDurum"> /// </param> public virtual void ozelDurumEkle(KokOzelDurumu ozelDurum) { if (ozelDurumlar.Length == 0) { ozelDurumlar = new KokOzelDurumu[1]; ozelDurumlar[0] = ozelDurum; } else { if (ozelDurumIceriyormu(ozelDurum.tip())) { return; } KokOzelDurumu[] yeni = new KokOzelDurumu[ozelDurumlar.Length + 1]; for (int i = 0; i < ozelDurumlar.Length; i++) { yeni[i] = ozelDurumlar[i]; } yeni[ozelDurumlar.Length] = ozelDurum; this.ozelDurumlar = yeni; } }