Yazan : Şadi Evren ŞEKER
Bilgisayar bilimlerinde özellikle otomatlar (automata) ve dil tasarımında (compiler design) oldukça sık kullanılan konulardan birisi de içerikten bağımsız dilbilgisidir. (Context Free Grammer)
İçerikten bağımsız dil (Context Free Language) konusunda yapılan çalışamlar gelişen ihtiyaçlar ilave bazı kurallar konulmasını gerektirmiştir. Bu konuda çalışan Naom Chomsky tarafından konulan kurallara CNF veya Chomsky normal şekli ismi verilir ve aşağıda açıklanmıştır.
CNF’in tanımı ve kuralları
Şayet bir CFG aşağıdaki kurallara uyuyorsa bu dilbilgisine CNF’e uygun denilebilir. Örneğin bir dilde
- A
BC veya
- A
α veya
- S
λ
şeklinde kurallara uyuyorsa. (Burada ABC birer devamlı (nonterminal) α bir sonlu (terminal) ve λ ise boş dizgi (empty string) gösteren sembollerdir). Burada B ve C sembolleri başlangıç sembolü olamaz. Yani
B α
gibi bir kural dilbilgisinde bulunamaz. Benzer şekilde
A BCC
şeklinde bir gösterim de CNF kurallarına aykırıdır (en fazla 2 devamlı (nonterminal) bulunabilir).
Yukarıdaki tanımdan anlaşılacağı üzere CNF kulllarına uygun olan her dil zaten CFG’dir. Ayrıca yine yukarıdaki tanıma dayanarak bir dildeki bir cümlenin parçalanması (parse) işlemi sırasındaki her adım, kendinden bir önceki adıma göre en fazla bir harf uzun olabilir. Bunun sebebi yukarıdaki şekilde yazılan bir dilde en fazla 2 devamlı (nonterminal) bulunacağı ve dolayısıyla en fazla 1 harf ilave edileceğidir.
Diğer bir ifadeyle CNF’e uygun bir dil parçalaranar bir parçalama ağacı (parse tree) oluşturulduğunda ortaya bir ikili ağaç (binary tree) çıkar ve bu ağacın en derin olma durumunda parçalanan kelimenin boyutundan 1 eksik (ilk devamlı açılımının (nonterminal) 2 elemanlı olduğu düşünülürse) ve en sığ olma durumunda da yine kelime boyutundan 1 eksik olacaktır. Daha kesin bir ifadeyle CNF’e uygun bir dil ile parçalanan bir kelime ve oluşan parçalama ağacında (parse tree) belirsizlik (ambiguity) bulunamaz ve her zaman tek bir ağaç çıkar.
Bir CFG’nin CNF’e çevrimi
Yukarıdaki açıklamalar ışığında her CFG’nin CNF yapısında olmadığını öğrendik. Ayrıca her CFG’nin CNF yapısına çevrilebileceği de bir gerçektir. Bu durumda herhangi bir CFG’nin CNF’e çevrimi için aşağıdaki 5 farklı durum ve bu 5 farklı durumun çözümü verilmiştir.
1. Durumda başlangıcın sağ tarafta bulunmasına karşılık ilave bir başlangıç devamlısı (nonterminal) eklenir.
Örneğin dilimiz aşağıdaki şekilde olsun:
SASA | aB
AB | S
Bb | λ
Yukarıdaki dilbilgisi tanımında görüleceği üzere iki noktada S yani başlangıç devamlısı (nonterminal) sağ tarafta bulunmaktadır. Çözüm olarak ilave bir devamlı eklenerek aşağıdaki hale getirilebilir:
S0 S
SASA | aB
AB | S
Bb | λ
Yukarıdaki bu yeni haliyle başlangıç geçişlisi artık S0 olmuştur ve artık sağ tarafta istenmeyen bu terim bulunmamaktadır.
2. durumda lambda (λ) terimlerinin temizlenmesi gerekir. Bu problemin çözümü için devamlılardan (nonterminal) başlanarak alternatif sonuçlar sıralanır. Örneğin bir önceki adımda oluşturduğumuz grameri ele alacak olursak:
S0 S
SASA | aB
AB | S
Bb | λ
Yukarıdaki gramerde B -> λ terimi bulunmaktadır. Bunu kaldırmak için B devamlısının (nonterminal) kullanıldığı yerlerde değişiklik yapmak gerekir.
S0 S
SASA | aB | AS | SA | S | a
AB | S
Bb
Yukarıdaki S-> AS | SA | S | a terimleri yeni eklenmiştir. Bu terimler B->λ terimi ile üretilebilecek bütün alternatifleri kapsar.
3. Durumda tek terimlerin kaldırılması için tek terimlilerde ulaşılabilen terimler tekrarlanır. Örneğin yukarıdaki gramerin son halinden devam edecek olursak:
S0 S
SASA | aB | AS | SA | S | a
AB | S
Bb
Gramerinde tek terili olarak S0 S , A
B ve A
S durumları bulunmaktadır. Bu durumların kaldırılması için terim değerleri tekrarlanır :
S0 ASA | aB | AS | SA | a
S ASA | aB | AS | SA | a
A b | ASA | aB | AS | SA | a
B b
Yukarıdaki son halinde S ve B değeri (okun sağ tarafında olan değerler) olduğu gibi kopyalanmıştır.
4. durumda şayet bir devamlının (nonterminal) tanımında karışık bir durum varsa (yani bir sonluyu (terminal) ifade eden terim karışıksa) basitletştirmek için ilave bir devamlı (nonterminal) eklenir. Yine yukarıdaki dilden devam edecek olursak:
S0 ASA | aB | AS | SA | a
S ASA | aB | AS | SA | a
A b | ASA | aB | AS | SA | a
B b
Gramerinde “a” sonlusunun (terminal) değerinin B devamlısı (nonterminal) ile yanyana durduğu aB terimini görüyoruz. Bu karışık bir durumdur ve çözümü için yeni bir devamlı (nonterminal) ilave edilir.
S0 ASA | UB | AS | SA | a
S ASA | UB | AS | SA | a
A b | ASA | UB | AS | SA | a
B b
U a
Yukarıdaki şekilde karışık olan bütün aB terimleri düzeltilmiştir.
5. durumda ise uzun terimlerin kısaltılması söz konusudur. Yani okun sağ tarafında en fazla iki devamlı (nonterminal) bir terimde bulunabilir. Örneğin ASA gibi üç devamlı (nonterminal) bulunduğu durumlar CNF için uygun değildir.
S0 ASA | UB | AS | SA | a
S ASA | UB | AS | SA | a
A b | ASA | UB | AS | SA | a
B b
U a
dilini ele alırsak
S0 AA1 | UB | AS | SA | a
S AA1 | UB | AS | SA | a
A b | AA1 | UB | AS | SA | a
B b
U a
A1 SA
Tek problemli olan ASA terimi yerine ilave bir devamlı (nonterminal) eklenerek yukarıdaki şekilde düzeltilebilir.
otomata gibi türkiyede fazla değer verilmeyen ama aslında derleyici programlama ve bilgisayar dünyasına yeni bir dil kazandırma konusunda çok önmeli olan bu dersimiz için de kaynaksız bırakmıyorsunuz bizi.teşekkürler….yanlış değilsem ege,bilkent,itü,boğaziçi ,gazi ve odtü tek işliyor bu dersi..
Işık üniversitesinde de var …. Theory of Computation…
Hemen hemen bütün bilgisayar mühendisliği bölümlerinde otomata dersi var.
Trakya Üniversitesinde BM/ Formel Diller dersinde görüyoruz.
Yıldız Teknik’te de var.
çukurova’da da var
programlamanın temeli olduğu için bir çok üniversitede bilgisayar mühendisliği bölümünde gösterilir.
Yani üniversiteler le alakası yok bilgisayar mühendisliği okuyorsanız bu dersi görme ihtimaliniz yüksek.
Doğu Akdeniz üniversitesindede mevcud.
CMPE 471
kocaeli üniversitesi (ilk defa bu yıl)
atılımda da işleniyor hacıaabi
Selçuk da da var…Bence üniversiteler her dersi vermesine gerek yok.Piyasa ihtiyacını da karşılamalılar.Sistem yazılımcısı gerçekten çok az…
harran üniversitesinde de var aşırı kaynak problemi yaşıyoruz
Evren hocam üniversitelerde hocalar keşke sizin gibi anlatabilse… Emeğinize sağlık çok güzel anlatmışsınız
(IYTE) Izmir Yuksek Teknoloji Enstitüsünde de var tabiki. Ve % 100 ingilizce.
Bu arada Evren hocam gercekten cok guzel anlatmissiniz emeginize saglik tesekkurler.
Tüm üniversitelerde var. Otomata dersi olmayan bi bilgisayar mühendisliği bölümü olamaz temel derstir.
“Daha kesin bir ifadeyle CNF’e uygun bir dil ile parçalanan bir kelime ve oluşan parçalama ağacında (parse tree) belirsizlik (ambiguity) bulunamaz ve her zaman tek bir ağaç çıkar.”
Bu ifade için bir kaynak kitap önerebilir misiniz? Hiç bir yerde CNF’nin ambiguity’i engellediğini göremedim ama. Örneğin;
S->
->
-> a
-> *
-> +
şeklinde bir gramerim olsa, a+a*a ifadesi için iki tane parse tree (veya leftmost türetim) çıkaramaz mıyım?
üstteki yorumda expression’lar çıkmadı. Sanırım yorumlayıcı benim yazdıklarımı yuttu.