You are on page 1of 99

Formel Diller

ve
Soyut Makineler
DERS 1
Dil ve Formel Dil Kavramları

 Dil, özellikle insanlar için, karmaşık iletişim sistemlerini edinme ve kullanma


kapasitesi ya da bu karmaşık iletişim sistemlerinden herhangi birine verilen
addır.
 Bir dilin formel olabilmesi için bazı niteliklerinin matematiksel kesinlikte tanımlı
olması gereklidir. Bu özellikler;
 Sembollerden oluşan bir alfabe ve
 Bu alfabedeki sembollerden oluşan bir ifadenin dile uygun (well-formed) olup
olmadığını belirleyen oluşum (formation) kurallarıdır.
 Bu şekildeki ilk formel dil Gottlob Frege tarafından 1879 yılında tanımlanmış olup
birinci dereceden mantık (first-order logic) olarak adlandırılmaktadır.
 Formel diller özellikle dilbilim ve bilgisayar bilimleri açısından önem taşımaktadır.
Dilbilim ve Formel Diller

 Dilbilimde formel diller, insan dilinin (yani doğal dilin) bilimsel bir şekilde
incelenmesi amacıyla kullanılmaktadır.
 Dilbilimciler, üretimsel (generative) bir yaklaşıma önem verirler. Bunun
nedeni, bir dile göre kabul edilebilir herhangi bir cümlenin oluşturulmasında
kullanılabilecek (sonlu) kurallar kümesi olan dil düzeneğini / grameri
(grammar) tanımlama / ortaya koyma işiyle ilgilenmeleridir.
 Bir gramer cümlelerin yalnızca biçimleriyle (form) ilgilenmekte olup,
anlamlarını tanımlamamakta, farklı bağlamlarda kullanımlarıyla da
ilgilenmemektedir.
Gramer ve Formel Diller

 Noam Chomsky, 1957 yılında yayınlanan Syntactic Structures (Sözdizimsel


Yapılar) adlı kitabında dilsel bilginin formel bir gramer kullanarak
modellenebileceğini ortaya koymuştur.
 Chomsky, formel gramerlerin konuşmacı ya da dinleyiciye sonsuz sayıda
cümleyi sınırlı sayıda gramer kuralı ve sonlu sayıda terimle üretme ve
yorumlama yeteneği kazandırdığını kurduğu modelle göstermiştir.
 Chomsky’e göre insan beyni, dilin düzenlenmesini sağlayan sınırlı bir kurallar
kümesine sahiptir ve bu kurallar kümesini Evrensel Gramer (Universal
Grammar) olarak adlandırmıştır. Gramerin temel kuralları beyinde
donanımsal olarak (yani doğuştan gelecek şekilde) kodlanmıştır ve
öğretilmelerine gerek kalmadan kendilerini kullanıma sokmaktadırlar.
Gramer ve Formel Diller

 Chomsky, formel gramerleri artan ifade gücünü temel alacak şekilde


sınıflandırarak birbirinden ayıran hiyerarşik bir yapı önermiştir.
 Bu hiyerarşideki her bir üst sınıf kendinden altta olan sınıflara göre daha
geniş bir formel dil üretim kapasitesine sahiptir.
 Gerçekte de bu hiyerarşiye uygun biçimde doğal dilin bazı boyutları için
daha karmaşık formel gramerlere ihtiyaç duyulmaktadır.
 Örneğin, bir düzenli dil (regular language) Türkçe’nin morfolojik yapısını
modellemede yeterli olmaktayken, sözdizimini modellemede yetersiz
kalmaktadır.
Chomsky Hiyerarşisi

Grammar Type Grammar Accepted Language Accepted Automaton

Type 0 Unrestricted grammar Recursively Turing


enumerable Machine
language
Type 1 Context-sensitive grammar Context-sensitive Linear-
language bounded
automaton
Type 2 Context-free grammar Context-free Pushdown
language automaton

Type 3 Regular grammar Regular language Finite state


automaton
Bilgisayar Bilimleri ve Formel Diller

 Bilgisayar bilimlerinde formel diller programlama dillerinin kesin ve katı kurallarını


tanımlamada kullanılmaktadır. Bu yönüyle derleyicilerin de temellerini
oluşturmaktadırlar.
 Bir derleyici, bir programlama dilinde (kaynak dil) yazılmış olan bir kaynak
kodun başka bir bilgisayar diline (hedef dil) dönüştürülmesi işini yerine getiren
program ya da programlar kümesidir.
 Derleyicilerin en genel amacı, kaynak kodun çalıştırılabilir bir program haline
getirilmesi için dönüştürülmesidir.
 Bu amaçla bilgisayar bilimlerinde önem verilen, soyut makinelere (otomatlar)
dayanan bir tanıma (recognition) yaklaşımıdır. Bu yaklaşımda soyut makine bir
girdi cümlesi almakta ve bu cümlenin referans alınan dile ait olup olmadığını
belirlemektedir.
Derleyiciler
Derleme Aşamaları
Otomatlar ve Formel Diller

 « Automata » terimi Yunancadan gelmekte ve « kendi kendine eylemde bulunabilen »


anlamına gelmektedir.
 Bir otomat, önceden belirlenmiş bir işlemler dizisini takip ederek kendiliğinden çalışabilen
soyut bir bilgisayım cihazıdır.
 1950’lerde Stephen Kleene, sonlu bir bellekle donanmış soyut durum makineleri olan sonlu
otomatları ortaya atmıştır.
 Kleene, bu modelle temel mantıksal öncülleri kullanarak böyle bir modelin sembol dizileri
ile eşleniklik gösterdiğini belirtmiştir.
 Alan Turing (ve ondan bağımsız olarak Emil Post ile John Backus), bas-bırak otomatlarının
(push-down automata) ardında yatan düşünceleri ortaya koymuşlardır.
 Alan Turing, 1936’da Turing Makinesi kavramını ortaya atmıştır. Bu makine, bir soyut durum
makinesi olup, şerit şeklinde sonsuz bir belleğe sahiptir. Turing makineleri, herhangi bir
algoritmanın işleyişinin benzetimini yapabileceği gibi daha yüksek seviyelerdeki biçimsel
dilleri de tanıyabilmektedir.
Otomatlar ve Gramerler

 Hangi formel dil sınıfı hangi otomat türüyle tanınabilmektedir?


 Chomsky hiyerarşisi ile farklı tipteki otomatlar arasında bir eşleniklik vardır. Bu
nedenle formel dillere ilişkin kuramlar hem gramerler hem de otomatlar olarak
ele alınabilmektedir.
Chomsky Hiyerarşisi
Formel Dillerin Betimlenmesi: Üretimsel
(Generative)Yaklaşım

 Üretimsel yaklaşımda bir dil, bir gramer tarafından üretilen karakter


katarlarının (string) kümesidir.
 Bu yaklaşımdaki üretim süreci;
 bir başlangıç sembolü ile başlama,
 yeniden yazma (rewrite) kuralları ile genişletme,
 dile ait bir ifade üretildiğinde de durma şeklinde gerçekleştirilmektedir.
Formel Dillerin Betimlenmesi: Tanıma
(Recognition)Yaklaşımı

 Bu yaklaşıma göre bir dil bir otomat tarafından kabul edilen ifadeler /
katarlar kümesidir.
 Bu yaklaşımdaki tanıma süreci;
 Bir başlangıç durumu ile başlama,
 Katardaki semboller yardımıyla diğer durumlara geçişler,
 Bütün katar tükendiğinde kabul durumuna ulaşma ya da katarın belirli bir
konumunda reddetme şeklinde olmaktadır.
Formel Diller: Tanımlar ve Temel
Kavramlar

 Bir formel dil, o dilin üzerinden tanımlanmış olduğu alfabedeki sembollerin


kullanımıyla oluşturulan sonlu karakter dizilerinin / ifadelerin kümesidir.
 Alfabe, sonlu ve boş olmayan bir semboller kümesidir.
 ∑1 = {0, 1}
 ∑2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
 ∑3 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}
 ∑4 = {a, b, c, ...., z}
Formel Diller: Tanımlar ve Temel
Kavramlar

 Bir ∑ alfabesi üzerinde tanımlı olan bir katar (ya da kelime), ∑ alfabesindeki
sembollerden oluşan sonlu bir dizidir.
 1010 ϵ ∑1

 123 ϵ ∑2

 merhaba ϵ ∑4

 Bir alfabedeki her sembol kendi başına bir katardır.


 ε veya λ boş katardır ve sembol içermez.
Formel Diller: Tanımlar ve Temel
Kavramlar

 |w|, w katarının uzunluğudur.


 |a| = 1
 |125| = 3
 |ε|=0
 Bir ∑ alfabesinin k’ıncı kuvveti (k-th power), o alfabedeki semboller
kullanılarak oluşturulan k uzunluğundaki katarların kümesidir.
 ∑0 = herhangi bir ∑ için {ε}
 ∑11 = {0, 1}
 ∑12 = {00, 01, 10, 11}
Formel Diller: Tanımlar ve Temel
Kavramlar

 Bir ∑ alfabesi için tanımlanan Kleene sonlandırıcıları (closures) şunlardır;


 ∑ alfabesi için ∑* bu alfabeden oluşturulan boş katar da dahil olmak üzere tüm
katarların kümesini göstermektedir ve Kleene Yıldızı (Kleene Star) olarak
adlandırılmaktadır.
 Gösterimi : ∑* = ∑0 ∪ ∑1 ∪ ∑2 ∪…….
 Örnek − Eğer ∑ = {a, b} ise ∑*= {λ, a, b, aa, ab, ba, bb,………..}
 ∑ alfabesi için ∑+ bu alfabeden oluşturulan boş katar hariç tüm katarların
kümesini göstermektedir ve Kleene Artısı (Kleene Plus) olarak
adlandırılmaktadır.
 Gösterimi : ∑+ = ∑1 ∪ ∑2 ∪…….
 ∑+ = ∑* − { λ }
 Örnek − Eğer ∑ = { a, b } ise ∑+ ={ a, b, aa, ab, ba, bb,………..}
Formel Diller: Tanımlar ve Temel
Kavramlar

 Formel dilin matematiksel tanımı: belirli bir ∑ alfabesi için ∑* nin herhangi bir
alt kümesi bir dildir.
 İngilizce, Türkçe, Çince,...
 C, Pascal, Java, HTML,...
 İkili tabandaki asal sayılar:
 {10, 11, 101, 111, 1011, ... }

 {ε}
Formel Diller: Tanımlar ve Temel
Kavramlar

 L1 ve L2 dillerinin sırasıyla ∑1 ve ∑2 alfabeleri üzerinden tanımlanmış diller


olduğunu kabul edersek;
Gelecek Derslerde...

 Düzenli Diller
 Düzenli İfadeler
 Sonlu Durum Otomatları
 Belirlenimsiz Sonlu Durum Otomatları
 Çift Yönlü Sonlu Durum Otomatları
 Bağlamdan Bağımsız Diller
 Bağlama Duyarlı Diller
 Özyinelemeli Olarak Sayılabilir Diller
 Bas-Bırak Otomatları
 Turing Makineleri
Formel Diller
ve
Soyut Makineler
OTOMAT KURAMI & SONLU DURUM OTOMATLARI
Otomat Kuramı

 Otomat kuramı, bilgisayar bilimlerinin kuramsal bir alt alanıdır.


 Temelleri 20. yy’da matematikçilerin insanın belirli özelliklerini taklit edebilen, özellikle de
hesaplamaları daha güvenilir ve hızlı biçimde yapabilen, hem kuramsal hem de
uygulamaya dökülmüş makineleri geliştirmeye başlaması ile atılmıştır.
 « Otomat » kelimesi « otomasyon » kelimesiyle yakın anlamda olup, belirli süreçlerin
gerçekleştirimini sağlayan otomatikleştirilmiş işlemler bütününü ifade eder.
 Otomat Kuramı ise, « otomat » olarak adlandırılan basit makineler üzerinden
gerçekleştirilen hesaplama işlemlerinin mantığıyla ilgilenir.
 Otomatlar sayesinde bilgisayar bilimciler makinelerin fonksiyonları nasıl hesaplayabildiği ve
problemleri nasıl çözebildiğini anlama imkanı bulur. Daha da önemlisi, bir fonksiyonun
hesaplanabilir (computable) olarak tanımlanması veya bir sorunun karar verilebilir
(decidable) olup olmadığının anlaşılması bu kuram ile mümkün olur.
Chomsky Hiyerarşisi

Karmaşıklık Özyinelemeli - Sayılabilir Diller : Turing Makinesi


(Recursively – Enumerable Languages : Turing Machine)
Bağlama - Duyarlı Diller : Doğrusal – Sınırlandırılmış Otomatlar
(Context – Sensitive Languages : Linear – Bounded Automata)
0 1 2 3
Bağlam - Bağımsız Diller : Bas – Bırak Otomatları
(Context – Free Languages : Push – Down Automata)
Düzenli Diller : Sonlu - Durum Otomatları
(Regular Language : Finite – State Automata)

*(Dil : Otomat)
Tip 3 – İfade Gücü

Düzenli İfadeler

Düzenli Diller

Sonlu Durum Düzenli


Otomatları Gramerler
Bir Otomat Örneği - Turnike

Şimdiki Durum Girdi Sonraki Durum Çıktı


Açık konuma geç (kol itildiğinde
Kart bas Açık
Kapalı geçilebilir durumdadır)
Kolu it Kapalı Aynı durumda kal
Kart bas Açık Aynı durumda kal

Açık Kapalı konuma geç (turnikeden


Kolu it Kapalı geçildikten sonra kol kilitli
duruma geçer)
Sonlu Durum Otomatı
Biçimsel Olmayan Tanım

 Bir sonlu durum otomatı;


 girdi şeridi olarak da bilinen sonlu bir bellek,
 okuyucu başlık,
 sonlu sayıda ve boş olmayan durumlar,
 bir giriş alfabesi,
 durumlar arası geçişleri betimleyen bir geçiş fonksiyonu,
 bir başlangıç durumu ile
 sonlu sayıda durma durumundan oluşan soyut bir hesaplama aygıtıdır.
Sonlu Durum Otomatı
Çalışma Mantığı

 Girdi şeridi hücrelere bölünmüştür ve her bir hücre giriş alfabesine ait bir
sembol barındırır.
 Okuyucu başlık, bir adımda şeritten tek bir sembolü okur.
 Geçiş fonksiyonu üzerinden bir sonraki durum belirlenir.
 Okuyucu başlık ya soldan sağa ya da sağdan sola okuma yapabilir.
 Okuyucu başlık şerit üzerinde yazma işlemi yapamaz ve geriye doğru
gidemez. Bu nedenle bir sonlu durum otomatı o anda okumakta olduğu
sembolden önceki sembolleri hatırlayamaz.
 Bu durum, sonlu durum otomatlarınının en önemli kısıtıdır.
Sonlu Durum Otomatı
Biçimsel Tanım

 Bir otomat, (Q, ∑, δ, q0, F) şeklinde bir beşli olarak tanımlanır ve bu tanıma
göre;
 Q sonlu sayıda elemana sahip bir durumlar kümesi,
 ∑ sonlu sayıda elemana sahip semboller kümesi (ya da alfabe),
 δ geçiş fonksiyonu,
 q0 herhangi bir girdinin işlenmeye başlanacağı başlangıç durumu (q0 ∈ Q).
 F, Q içindeki son durum(lar) kümesi (F ⊆ Q).
Sonlu Durum Otomatı Türleri

Sonlu Durum Otomatları

Çıktı Üretmeyenler Çıktı Üretenler

Deterministik Deterministik Olmayan Moore Makinesi Mealy Makinesi


Deterministik Sonlu Durum Otomatı

 Deterministik sonlu durum otomatlarında her bir giriş sembolü karşılığında


içinde bulunulacak (yani geçilecek) durum belirlidir.
 Bir deterministik sonlu durum otomatı, (Q, ∑, δ, q0, F) şeklinde bir beşli olarak
tanımlanır ve bu tanıma göre;
 Q sonlu sayıda elemana sahip bir durumlar kümesi,
 ∑ sonlu sayıda elemana sahip semboller kümesi (ya da alfabe),
 δ geçiş fonksiyonu (δ: Q × ∑ → Q),
 q0 herhangi bir girdinin işlenmeye başlanacağı başlangıç durumu (q0 ∈ Q).
 F, Q içindeki son durum(lar) kümesi (F ⊆ Q).
Grafiksel Gösterim

 Deterministik bir sonlu durum otomatı durum diyagramı adı verilen bir çizge
ile ifade edilir. Bu çizgede:
 Düğümler durumları,
 Alfabeden bir sembolle etiketlenmiş olan kenarlar geçişleri,
 Kendisine gelen boş bir kenarla işaretli olan düğüm başlangıç durumunu,
 İç içe iki çember şeklinde işaretli olan düğüm ise son durumu ifade eder.
Örnek

 Q = {a, b, c},
 ∑ = {0, 1},
 q0={a},
 F={c}, ve
 Geçiş fonksiyonu olan δ aşağıdaki gibidir.
Şimdiki 0 girdisi için 1 girdisi için
Durum sonraki durum sonraki durum
a a b
b c a
c b c
Örnek

 Yalnızca 3’ün katı olan ikili tabandaki sayıları kabul eden sonlu durum
otomatı
Örnek

 İçerisinde çift sayıda b bulunduran tüm katarların kümesi.


Örnek
Örnek

 L = {anbm | n,m ≥ 1}, Σ={a, b}


L = {ab, aab, aaab, abbb, aabb, aaaabbbb, ...}
Deterministik Olmayan Sonlu Durum
Otomatı

 Deterministik olmayan sonlu durum otomatlarında belirli bir giriş sembolü


makinedeki herhangi bir durum kombinasyonuna geçişi sağlayabilir. Yani,
makinenin belirli bir durumda belirli bir sembolle hangi duruma geçiş
yapabileceği tam olarak bilinemez.
 Bir deterministik olmayan sonlu durum otomatı, (Q, ∑, δ, q0, F) şeklinde bir beşli
olarak tanımlanır ve bu tanıma göre;
 Q sonlu sayıda elemana sahip bir durumlar kümesi,
 ∑ sonlu sayıda elemana sahip semboller kümesi (ya da alfabe),
 δ geçiş fonksiyonu (δ: Q × {∑ ∪ ε} → 2Q),
 q0 herhangi bir girdinin işlenmeye başlanacağı başlangıç durumu (q0 ∈ Q),
 F, Q içindeki son durum(lar) kümesi (F ⊆ Q).
Örnek

 Q = {a, b, c}
 ∑ = {0, 1}
 q0 = {a}
 F={c}
 Geçiş fonksiyonu olan δ aşağıdaki gibidir.

Şimdiki durum 0 girdisi için 1 girdisi için


sonraki durum sonraki durum
a a, b b
b c a, c
c b, c c
Örnek

 İçinde 00 veya 11 barındıran katarlar


Örnek

 Sonu 101 ile biten katarlar


Örnek

 a* + (ab)*
Moore ve Mealy Makineleri

 A

 b
Formel Diller
ve
Soyut Makineler
DÜZENLİ İFADELER & DÜZENLİ GRAMERLER
Chomsky Hiyerarşisi - Tip 3

Düzenli İfadeler

Düzenli Diller

Sonlu Durum Düzenli


Otomatları Gramerler
Sonlu Durum Otomatları (FSA)

!
m e e

q0 q1 q2 q3 q4 DFSA

e
Sonlu Durum Otomatları (FSA)

m e e !

q0 q1 q2 q3 q4

e
! NFSA
m e e

q0 q1 q2 q3 q4

ε
Otomatların Denkliği - 1

 ‘abc’ ve ‘bac’ alt katarlarından en az birinin, en az bir kez içerildiği durumları


tanıyan/arayan deterministik ve deterministik olmayan otomatlar

 Deterministik olmayan sonlu durum otomatları, deterministik sonlu durum otomatlarına


göre problemlere daha soyut düzeyde ve daha kolay modellenebilir çözümler sunabilirler.
Otomatların Denkliği - 2
Boş Geçişli Sonlu Durum Otomatları

 Boş geçişli sonlu otomatlar, deterministik olmayanlara benzer şekilde bir


beşli olarak tanımlanır:
DFA = <Q, Σ, δ, q0, F>
Q : Sonlu sayıda durum içeren durumlar kümesi
Σ : Sonlu sayıda giriş simgesinden oluşan alfabe
q0: Başlangıç durumu (q0 ϵ Q)
F : Son durumlar kümesi (F ⊆ Q)
δ : Geçiş fonksiyonu (Q x (Σ U {ɛ})  2Q)
Sözcük Tanımada Boş Geçiş Kullanımı
DÜZENLİ
İFADELER
REGULAR EXPRESSIONS
Düzenli İfadeler

 Biçimsel Tanım: Karakter katarı kümelerinin cebirsel olarak tanımlanmasını sağlayan bir
gösterim yöntemidir (Stephen C. Kleene, 1956).
 Karakter dizileri içinde, belirlenen örüntüleri (pattern) taramaya yarar.
 Kullanım alanları:
– Arama motorları
– Bilgi edinimi (Information retrieval)
– Kelime işleme (Word processing)
– Veri doğrulama (Data validation)
– ...
 Herhangi bir düzenli ifade doğrudan NFSA’ya, buradan da DFSA’ya dönüştürülebilir.
 NFSA (backtracking), DFSA veya melez yöntemler kullanılarak gerçekleştirimleri yapılabilir.
Basit Düzenli İfadeler

 En basit düzenli ifadeler karakterlerin sıralı biçimde dizilmesiyle oluşur.


 Düzenli ifadeler büyük – küçük harf duyarlıdır.
• /abc/ a b c

q0 q1 q2 q3

• /okula/  ‘Ali okula gelmedi.’


• /okul/  ‘Ali okula gelmedi.’
• /a/  ‘Ali okula gelmedi.’
• /okula gelmedi/  ‘Ali okula gelmedi.’
Karakter Seçimi ve Aralıklar

 Kare parantezler arasına yazılan karakterler, ‘veya’ (disjunction) işlemine tabi olurlar.
• /a[bc]/ a b

q0 q1 q2
c
 ‘-’ işareti ile kare parantez içinde bir aralık belirtilebilir.
• /[Bb]ahçe/  Bahçe veya bahçe
• /[abc]/  a veya b veya c
• /[1234567890]/  Herhangi bir rakam
• /[A-Z]/  Herhangi bir büyük harf (İngiliz alfabesindeki 26 harften biri)
• /[a-z]/  Herhangi bir küçük harf (İngiliz alfabesindeki 26 harften biri)
• /[0-9]/  Herhangi bir rakam
Ekleme (Concatenation)

q0 qf q0 qf

FSA1 FSA2
* ve + (Kleene star / plus)

 ‘*’ karakteri kendinden önce gelen karakterin veya düzenli ifadenin 0 veya daha fazla kez ardışık olarak tekrarlanabileceğini belirtir.
• /ab*c/  ac, abc, abbc, abbbc, …
a b

q0 q1 q2
c
• /[0-9][0-9]*/  bir veya daha fazla sayıda ardışık rakam

 ‘+’ karakteri kendinden önce gelen karakterin veya düzenli ifadenin 1 veya daha fazla kez ardışık olarak tekrarlanabileceğini belirtir.
• /ab+c/
a b b

q0 q1 q2 q3
c
• /[0-9]+/  bir veya daha fazla sayıda ardışık rakam
Kleene * (Closure)

ε ε
q0 q0 qf qf

FSA1

ε
| (pipe)

 Bu karakter örüntüler arasında ‘veya’ işlevi görür.


a b c
• /abc|ab/

q0 q1 q2 q3
• /elma|portakal/  elma veya portakal
 ‘()’ şeklindeki normal parantezler içine alınan ifadeler tek bir karaktermiş gibi işlenir.
• /a(bc|bd)/
a b c

q0 q1 q2 q3
d
• /yüz(er|erler)/  yüzer veya yüzerler
Birleşme (Union)

q0 qf
ε ε

FSA1
q0 qf

ε
ε

q0 qf

FSA2
? ve .

 ‘?’ karakteri kendinden önce gelen karakterin veya


düzenli ifadenin seçimlik olduğunu belirtir.
a b
 /ab?c/ q2
c

q0 q1 q3

• /evleri?/  evler veya evleri c


• /colou?r/  color veya colour

 ‘.’ karakteri tekil herhangi bir karakterin yerine geçebilir.


• /dö.me/  dökme veya dövme gibi
İfade Sınırları

 \b özel karakteri, kullanıldığı yere göre, aranan ifadenin önünde veya


arkasında sınırlayıcı (boşluk gibi) karakterleri sınır olarak kabul eder.
• /\beli\b/  önünde ve arkasında boşluk olan ‘eli’ ifadesini bulur
 \B karakteri sınırlandırma olmayan durumu belirtir.
^ (caret) ve $

 ^ karakteri 3 farklı şekilde kullanılabilir.


1) Aralık için olumsuzlama
 /[^A-Z]/  büyük harf harici karakter
 /[^Ss]/  S veya s harici karakter
 /[^\.]/  nokta harici karakter
2) Satır başına bağlama
 /^Avrupa/  satır başında ‘Avrupa‘ olan durum
3) Normal karakter olarak kullanım
 /[e^]/  e veya ^
 /a^b/  a^b örüntüsü

 $ karakteri ise normal bir karakter olarak kullanılabileceği gibi satır sonuna bağlama için de
kullanılabilir.
 /gittiler\.$/  satır sonunda ‘gittiler’ olan durum
Sayaçlar

 Herhangi bir düzenli ifadenin ne kadar tekrarlanacağını belirtirler.


• {n}  kendinden önceki düzenli ifade n defa ardışık olmalıdır.
• {n, m}  kendinden önceki düzenli ifade en az n, en çok m defa ardışık olmalıdır.
• {n,}  kendinden önceki düzenli ifade en az n defa ardışık olmalıdır.
Operatör Öncelik Hiyerarşisi

 En yüksekten en düşük öncelikli operatöre doğru sıralama şu şekildedir:


1. Parantez ()
2. Sayaçlar * + ? {}
3. Seriler veya bağlayıcılar  evler ^Yarın gelecek$
4. Veya  | (pipe)
Özel Operatörler

 \d  herhangi bir rakam ([0-9])


 \D  rakam olmayan bir karakter ([^0-9])
 \w  alfanümerik karakterler ve _ karakteri ([a-zA-Z0-9_])
 \W  alfanümerik olmayan karakterler ([^\w])
 \s  boşluk karakterleri ([ \r\t\n\f])
 \S  boşluk olmayan karakter ([^\s])
 \n  newline
 \r  carriage return
 \t  tab
 \f  form feed
 \.  nokta
Örnekler

 Tarih  02/04/2020

 (\d{1,2}\/\d{1,2}\/\d{4})
 E-posta adresi

 (\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})
 IP adresi

 \b([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\b
Yer Değiştirme (Substitution)

 Bazı durumlarda arama işlemine ek olarak, bulunan


örüntü örneğinin yer değiştirmesi de gerekebilir.
 Bu işlem için düzenli ifadelerin temel tanımına ait
olmayıp, gelişmiş bir özellik olan bellek kullanımı
gereklidir.
 Bu özellik kullanıldığında ifade gücü Tip – 3 dillerin
üzerine çıkar.
 Arama örüntüsü içinde ‘(‘ ile başlayıp, ‘)’ ile biten
parçalara yer değiştirme işleminde, \1 gibi numaralı bir
yazmaç (register) ile referansta bulunulur.
ELIZA (Weizenbaum - 1966)

User: Men are all alike.


ELIZA: IN WHAT WAY
User: They are always bugging us about something or other.
ELIZA: CAN YOU THINK OF A SPECIFIC EXAMPLE
User: Well, my boyfriend made me come here.
ELIZA: YOUR BOYFRIEND MADE YOU COME HERE
User: He says I am depressed much of the time.
ELIZA: I AM SORRY TO HEAR YOU ARE DEPRESSED

s/.* I am(depressed|sad) .*/I AM SORRY TO HEAR YOU ARE \1/


s/.* I am(depressed|sad) .*/WHY DO YOU THINK YOU ARE \1/
s/.* all .*/IN WHAT WAY/
s/.* always .*/CAN YOU THINK OF A SPECIFIC EXAMPLE/
DÜZENLİ
GRAMERLER
REGULAR GRAMMARS
Düzenli Gramerlerin Bileşenleri

Bir düzenli gramer şu 4 bileşenden oluşur:

1. N: Sonlu bir terminal olmayan semboller kümesi.


2. S ϵ N: Başlangıç sembolü.
3. T: Terminal semboller kümesi.
4. P: Şu iki kural şemasından birine uyan yeniden yazma (üretim) kuralları:
i. Y  α, X
ii. Y  β
iii. Y  ε
ya da
i. Y  X, α
ii. Yβ
iii. Yε (X, Y ∈ N ve α, β ∈ T)
Sonlu Durum Otomatlarının Düzenli
Gramere Dönüştürülmesi (1)
SONLU DURUM OTOMATI: DÜZENLİ GRAMER:
q0, q2 ve q3 yerine sırasıyla S, A ve B sembollerini
kullanarak;

S1S
S0A
A0A
A1B
B0B
B1B
A1
B0
B1
Sonlu Durum Otomatlarının Düzenli
Gramere Dönüştürülmesi (2)
SONLU DURUM OTOMATI: DÜZENLİ GRAMER:
q0, q1, q2 ve q3 yerine sırasıyla S, A, B
ve C sembollerini kullanarak;

S1A
S0B
A1S
A0C
B1C
B0S
C1B
C0A
A1
B0
Sϵ
Sözcüksel
Çözümleme
LEXICAL ANALYSIS
Programlama Dillerinin
Gerçekleştirimleri

 Programlama dillerinin gerçekleştirimleri iki farklı yolla olabilir:


 Yorumlayıcılar (Interpreter) bir programın az veya hiç ön işleme
yapılmadan, platformdan bağımsız olarak çalıştırılmasını sağlar.
 Derleyiciler (Compiler) programı yoğun bir ön işlemeden geçirir ve 2-
20 kat arası daha hızlı çalışmayı sağlar. Platforma özgü kod üretirler.
 Bazı diller için ise bu iki yolun birleşimi şeklindeki melez
gerçekleştirimler kullanılır.
İlk Derleyiciler

 Üzerinde assembly dili ile program yazılabilen ilk bilgisayarlar


1950’lerde üretildi.
 Ancak assembly ile hızlı kod yazımı ve büyük projelerin
geliştirilmesi çok uzun zaman alıyordu.
 1953’te John Backus ilk yorumlayıcıyı üretti ancak bu assembly
kodundan daha yavaş çalışıyordu.
 1956’da Backus ve arkadaşları, FORTRAN dilinin ilk derleyicisini
ürettiğinde ise hız sorunu aşılmış oldu.
Programlama ve Formel Diller

 Bilgisayar bilimlerinde formel diller programlama dillerinin kesin ve


katı kurallarını tanımlamada kullanılmaktadır. Bu yönüyle
derleyicilerin de temellerini oluşturmaktadırlar.
 Bir derleyici, bir programlama dilinde (kaynak dil) yazılmış olan bir
kaynak kodun başka bir bilgisayar diline (hedef dil) dönüştürülmesi
işini yerine getiren program ya da programlar kümesidir.
 Derleyicilerin en genel amacı, kaynak kodun çalıştırılabilir bir
program haline getirilmesi için dönüştürülmesidir.
 Bu amaçla bilgisayar bilimlerinde önem verilen, soyut makinelere
(otomatlar) dayanan bir tanıma (recognition) yaklaşımıdır. Bu
yaklaşımda soyut makine bir girdi cümlesi almakta ve bu cümlenin
referans alınan dile ait olup olmadığını belirlemektedir.
Programlama Dilleri

MOVF id3, R2
MULF #10.0, R2
sonuc = a + b * 10; MOVF id2, R1
ADDF R2, R1
MOVF R1, id1

Yüksek Seviye Düşük Seviye


Otomatik Çeviri Paradigması

Ara Dil

aktarım

doğrudan çeviri

Kaynak Hedef
Dil Dil
Modern Derleyiciler

 Günümüzde derleyiciler de otomatik çeviri paradigmasına


uygun olarak geliştirilirler. Bu sebeple iki ana bileşenden oluşurlar:
 Çözümleme işlemleri için kullanılan ön uç (front end), kaynak
programlama dilini işler ve bundan bir ara gösterim elde eder.
 Üretim aşaması ise arka uç (back end) bileşeninde kodun
optimizasyonu ve hedef dile dönüştürülmesiyle gerçekleşir.
 Hedef dil genelde assembly olur. Böylece yüksek seviye bir
programlama dilinin makine düzeyine indirgenmesi sağlanır.
Bir Derleyicinin Yapısı
Kaynak Dil

Sözcüksel Çözümleyici

Sözdizimsel Çözümleyici
Ön Uç
Anlamsal Çözümleyici
Ara Kod Üretici

Ara Kod

Kod Optimizasyonu
Arka Uç
Hedef Dil Üretici

Hedef Dil
Derleme Örneği
Kaynak Dil
Kaynak Dil:
Sözcüksel Çözümleme cur_time = start_time + cycles * 60

Sözdizimsel Çözümleme Sözcüksel Çözümleme:


ID(1) ASSIGN ID(2) ADD ID(3) MULT INT(60)
Anlamsal Çözümleme
Sözdizimsel Çözümleme: Anlamsal Çözümleme:
Ara Kod Üretici ASSIGN ASSIGN

ID(1) ADD ID(1) ADD


Ara Kod
ID(2) MULT ID(2) MULT

Kod Optimizasyonu ID(3) INT(60) ID(3) int2real

Hedef Dil Üretici INT(60)

Hedef Dil
Derleme Örneği
Kaynak Dil
Ara Kod: Optimize Edilmiş Kod:
Sözcüksel Çözümleme temp1 = int2real(60) temp1 = id3 * 60.0
temp2 = id3 * temp1 id1 = id2 + temp1
temp3 = id2 + temp2
Sözdizimsel Çözümleme id1 = temp3 Hedef Dil:
MOVF id3, R2
Anlamsal Çözümleme Optimizasyon: MULF #60.0, R2
Adım 1: MOVF id2, R1
Ara Kod Üretici temp1 = 60.0 ADDF R2, R1
temp2 = id3 * temp1 MOVF R1, id1
temp3 = id2 + temp2
Ara Kod id1 = temp3

Adım 2:
Kod Optimizasyonu temp2 = id3 * 60.0
temp3 = id2 + temp2
Hedef Dil Üretici id1 = temp3

Adım 3:
Hedef Dil temp2 = id3 * 60.0
id1 = id2 + temp2
Sözcüksel Çözümleme - 1

if (i==j);
z=1;
else;
z=0;
endif;
 Yukarıdaki kod parçası bizim için anlamlı ifadelerden oluşsa da
bilgisayar için aşağıdaki gibi bir karakter katarından öte bir şey
ifade etmez.

i f _ ( i = = j ) ; \n \t z = 1 ;
\n e l s e ; \n \t z = 0 ; \n e n d i f ;
Sözcüksel Çözümleme - 2

 Yüksek seviyeli bir dille yazılan kodun çalıştırılabilmesi için en


düşük seviyede bilgisayarın işleyebileceği komutlar dizisi haline
getirilmesi gereklidir.
 Bu sebeple kaynak kodu oluşturan karakter katarı anlamlı alt
parçalara ayrıştırılmalıdır.
 Alt parçalara token (belirtke), bunları ayrıştırma işlemine de
sözcüksel çözümleme denir.
 Sözcüksel çözümleme işleminin çıktısı olan tokenlar bir sonraki
aşama olan sözdizimsel çözümleme bileşenine aktarılır.
Sözcüksel Çözümleme - 3

 Token sözdizimsel bir kategori belirtir.


 Bu kategoriler doğal diller için “isim”, “sıfat”, “fiil” vb. olabilirken,
programlama dilleri için “matematiksel sembol” veya “anahtar
kelime” gibi alt ifadeler olurlar.
 Token belirten bir alt karakter katarı lexeme olarak adlandırılır.
 Programlama dili içinde kullanılması mümkün olan tüm lexemeler
tanımlanırken örüntüler (pattern) kullanılır.
 Örüntüler ise düzenli ifadeler (regular expressions) kullanılarak
tanımlanır.
 Bu aşamada düzenli ifadelerin kullanılmasının sebebi işlenen karakter
katarı içinde kabul edilebilir bir token bulabilmenin bazen geriye
dönük aramayı gerektirmesidir.
Sözcüksel Çözümleme - 4

 Bir sözcüksel çözümleme aracı aşağıdaki 3 işlevi yerine


getirmelidir:
1. Bütün boşluk ve açıklamaları temizlemeli,
2. Karakter katarı içindeki tüm tokenları bulmalı,
3. Bulunan token için lexeme ve bulunduğu satır numarası gibi
özellikleri döndürmelidir.

Lexeme Token
sum IDENTIFIER
= ASSIGN_OP
sum=3+2; 3 NUMBER
+ ADD_OP
2 NUMBER
; SEMICOLON
Sözcüksel Çözümleme - 5

sonuc = a + b * 10 Tarayıcı Lexeme Token


sonuc IDENTIFIER
= “=”
a IDENTIFIER
DÜZENLİ İFADELER + “+”
[ \t\n]* → boşluklar b IDENTIFIER
[a-z][A-zA-Z0-9]* → identifier * “*”
[0-9]+ → number 10 NUMBER

identifier “=” identifier “+” identifier “*” number

sonuc = a + b * 10
Düzenli İfadeler

 Sonlu durum otomatları (FSA) ile tanımlanabilen dilleri ifade


etmede kullanılırlar.
 Eğer A bir düzenli ifade ise, L(A) bu ifade ile tanımlanan dildir.
 L(“if”|”then”|”else”) dili sadece “if”, “then” ve “else” ifadelerini
tanıyabilen bir dil belirtir.
 Sözcüksel çözümleme işleminde tarayıcı (scanner), kaynak
kodun içinde önceden düzenli ifadelerle tanımlanmış anahtar
kelimeleri arar ve bunların token tiplerini belirler.
Düzenli İfadelerin Tasarımı

 Tanımladığımız düzenli ifadeler dil içerisindeki tüm ifadeleri


kapsamalıdır. Bu sebeple şu durumlar dikkate alınmalıdır:
1. Bir düzenli ifade özel bir token tipinin tüm durumlarını ifade
etmelidir.
2. Belirsizliği önlemek için en uzun olan eşleme seçilir.
3. Eş uzunluklu belirsizlik durumlarında ilk eşleme seçilir.
 n adet farklı token tipi olduğu varsayıldığında n farklı düzenli
ifade kullanılmalıdır. Bir token tipini tanıyan düzenli ifade Rn ile
gösterilirse, tüm tokenları tanıyan düzenli ifade topluluğu R şöyle
ifade edilir:
R = R1 | R2 | … | Rn
Lex ve Yacc - 1

 Yapısal programlamada yerine getirilmesi gereken iki temel görev vardır:


1. Girdiyi anlamlı alt parçalara ayırmak
2. Bu alt parçalar arasındaki ilişkiyi ortaya koymak
 Düzenli ifadeler veya sonlu durum otomatları ilk aşama için yeterli düzeyde ifade
gücüne sahip olsa da ikinci aşamada ortaya çıkabilecek özyinelemeli örüntüleri
tanımlamak için yeterli güce sahip değildir.
 İkinci aşama için kullanılan ayrıştırıcı (parser) yığıt (stack) gibi yapılardan
faydalanmalıdır.
 Bu işlemleri otomatik olarak gerçekleştirmeye yarayan çeşitli araçlar vardır.
 Lex, ilk aşamadaki token ayrıştırma işlemini düzenli ifadeler kullanarak
gerçekleştirecek C veya C++ kodunu otomatik olarak üreten bir yazılımdır.
 Yacc ise Lex tarafından üretilen çıktıyı alarak sözdizimsel kurallarla ayrıştırma işlemini
gerçekleştirecek kodu üreten bir yazılımdır.
 Bu iki yazılımın açık kaynak sürümleri flex ve bison’dır.
Lex ve Yacc - 2

 Lex içinde kullanılan düzenli ifadeler, Chomsky hiyerarşisi içinde


düzenli diller sınıfındadır.
 Yacc ise ayrıştırma işlemi için Backus – Naur Form (BNF) adı verilen
ve Chomsky hiyerarşisi içinde Bağlam Bağımsız Diller (Context-
Free) sınıfında olan bir gösterim kullanmaktadır.
 select_command ::=
"select" [ "all" | "distinct" ] ( "*" |
(displayed_column { "," displayed_column } ) ) "from"
(selected_table { "," selected_table } ) [ “where" condition ]
{ connect_clause } {group_clause } { set_clause } {
order_clause } {update_clause }
Sözdizim Analizi

CFG (G)
Ayrıştırıcı L(G), s’yi kabul eder
ve ağacı bulur.
Token dizisi (s)
Hata mesajları

CFG BNF (Backus-Naur Form)


S = {a,b} select_command ::= "select" [ "all" | "distinct" ] ( "*" |
N = {S} (displayed_column { "," displayed_column } ) )
"from" ( selected_table { "," selected_table } ) [
R = {S  aSb, S  } “where" condition ] { connect_clause } {
group_clause } { set_clause } { order_clause }
{update_clause }
Ayrıştırma
Expression → identifier
Expression → number
statement Expression → Expression "+" Expression
Expression → Expression "*" Expression
Expression → "(" Expression ")“
expression Statement → identifier "=" Expression

expression

expression expression expression

identifier identifier identifier number

sonuc = a + b * 10
Flex Kullanımı

 Sözcüksel çözümlemede kullanmak üzere bir tarayıcı üretmek


için öncelikle .lex uzantılı bir yapılandırma dosyası üretmek
gerekir.
 Bu dosya kullanılarak flex ile komut istemi üzerinden gerekli C
veya C++ kodu üretilir.
flex deneme.lex
 Üretilen kod derlenerek sözcüksel çözümleme işlemi yapılabilir.
gcc lex.yy.c –o main
Lex Program Yapısı

 Bütün lex programları yanyana iki % işareti kullanılarak birbirinden


ayrılan 3 bölümden oluşur.
 Tanım (definition) bölümü: C kodunun üstünde olması istenen tüm
kod buraya yazılır. Bütün kod “%{“ ile “%}” arasında yer almalıdır.
Kullanılması zorunlu değildir.
 Kurallar (rules) bölümü: Burada örüntüler ve bu örüntülerle
karşılaşıldığında yapılacak işlemler tanımlanır.
 Kullanıcı alt-programları (user sub-routines) bölümü: Lex
oluşturduğu koda bu alt-programları kopyalar.
Örnek – 1

%%
[\t ]+ /* boşlukları atla*/;
Pazartesi|Salı|Çarşamba|Perşembe|Cuma
{ printf("%s hafta içi bir gündür.", yytext); }
Cumartesi|Pazar
{ printf("%s haftasonu bir gündür.", yytext); }
[a-zA-Z]+
{ printf("%s gün değildir.", yytext); }
%%
int yywrap(void) { return 1; }
int main(void)
{ yylex(); return 0; }
Örnek – 2

%{
int line_num = 1;
%}
%%
[\t ]+ /* Boşlukları atla */;
\n { line_num++; }
[+-]?[0-9]+(\.[0-9]+)?([eE][+-]?[0-9]+)?
{printf(“satır no: %d \n", line_num);}
%%
int yywrap(void) { return 1; }
int main(void) {
yylex(); return 0;
}
Özet

 Derleyiciler yüksek seviye bir programlama dilini düşük seviye


bir dile dönüştürme işlemini gerçekleştirirler.
 Bu dönüşüm işleminin ilk aşaması sözcüksel çözümlemedir.
 sözcüksel çözümleme işlemleri düzenli diller sınıfında bir dil
tanımlama aracı olan düzenli ifadeler ile yapılabilir.
 Düzenli ifadelerin tanımlarından oluşan bir kod kullanılarak
flex yazılımıyla gerekli C veya C++ kodu üretilebilir.
 Sözcüksel çözümleme işlemleri sonucunda belirlenen
tokenlar derleyicinin sözdizim çözümlemeyi yapan parçasına
aktarılır.

You might also like