Professional Documents
Culture Documents
Formal Diller
Formal Diller
ve
Soyut Makineler
DERS 1
Dil ve Formel Dil Kavramları
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
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 ∑ alfabesi üzerinde tanımlı olan bir katar (ya da kelime), ∑ alfabesindeki
sembollerden oluşan sonlu bir dizidir.
1010 ϵ ∑1
123 ϵ ∑2
merhaba ϵ ∑4
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
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ı
*(Dil : Otomat)
Tip 3 – İfade Gücü
Düzenli İfadeler
Düzenli Diller
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
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
Q = {a, b, c}
∑ = {0, 1}
q0 = {a}
F={c}
Geçiş fonksiyonu olan δ aşağıdaki gibidir.
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
!
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
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
q0 q1 q2 q3
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)
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 .
q0 q1 q3
$ 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
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)
S1S
S0A
A0A
A1B
B0B
B1B
A1
B0
B1
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;
S1A
S0B
A1S
A0C
B1C
B0S
C1B
C0A
A1
B0
Sϵ
Sözcüksel
Çözümleme
LEXICAL ANALYSIS
Programlama Dillerinin
Gerçekleştirimleri
MOVF id3, R2
MULF #10.0, R2
sonuc = a + b * 10; MOVF id2, R1
ADDF R2, R1
MOVF R1, id1
Ara Dil
aktarım
doğrudan çeviri
Kaynak Hedef
Dil Dil
Modern Derleyiciler
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
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
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
Düzenli İfadeler
CFG (G)
Ayrıştırıcı L(G), s’yi kabul eder
ve ağacı bulur.
Token dizisi (s)
Hata mesajları
expression
sonuc = a + b * 10
Flex Kullanımı
%%
[\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