You are on page 1of 10

ch3

Tanıyıcılar (Recognizers), bir dilin girdi dizelerini okur ve bu girdi dizelerinin dilin bir parçası olup
olmadığına karar verir. Örneğin, bir derleyicinin sözdizimi analiz bölümü, programlama dilinin doğru
sözdizimine sahip olup olmadığını kontrol etmek için bir tanıyıcı olarak işlev görür. Bu bölüm, derleyicinin
girdi kodunu inceleyerek dilin yapısal kurallarına uyup uymadığını kontrol eder.

Üreticiler (Generators), bir dilin cümlelerini oluşturan bir cihazdır. Örneğin, bir dilin gramerine uygun
rastgele cümleler oluşturan bir yazılım bir üretici olarak işlev görebilir. Bu tür bir yazılım, dilin yapısını ve
kurallarını temel alarak doğru cümleleri üretir ve çeşitli amaçlar için kullanılabilir, örneğin, dilin test edilmesi
veya eğitim amacıyla kullanılabilir.

Bağlam Bağımsız Gramerler (Context-Free Grammars), Noam Chomsky tarafından 1950'lerin ortalarında
geliştirilmiştir. Bu gramerler, dil üreticilerini kullanır ve doğal dillerin sözdizimini tanımlamak için
tasarlanmıştır. Bağlam bağımsız gramatikler, dilin sözdizimi ve yapısal özelliklerini açıklamak için
kullanılır.Bağlam bağımsız gramatikler, dilin yapısal kurallarını tanımlar ve bu kurallara göre cümlelerin
oluşturulmasını sağlar. Her kural, bir sembol veya sembol dizisini başka semboller veya sembol dizilerine
dönüştürmek için bir üretici kural olarak düşünülebilir. Bu gramerler, dilin yapısal özelliklerini belirleyen bir
dizi kuralları içerir ve bu kuralların uygulanmasıyla dildeki doğru cümlelerin üretimi sağlanır.Bağlam
bağımsız gramatikler, bağlam bağımsız diller olarak adlandırılan bir dil sınıfını tanımlar. Bu dil sınıfı, bir
dilin sözdizimini tanımlayan kuralları kapsar ve birçok doğal ve yapay dil bu sınıfa girer. Bağlam bağımsız
dil sınıfı, bilgisayar biliminde ve dilbilgisinde önemli bir rol oynamaktadır, çünkü birçok programlama dilinin
sözdizimi ve dil işleme sistemlerinin temeli olarak kullanılır.
Backus-Naur Form (BNF), John Backus (ve Peter Naur'un katkılarıyla) tarafından Algol 58'i tanımlamak için
icat edilmiştir. BNF, bağlam bağımsız gramatiklere eşdeğerdir ve bir dilin sözdizimini açıklamak için
kullanılan bir metalenktir.
BNF, dilin yapısını tanımlamak için kullanılan bir formattır. Bu formatta, dilin sentaksını ve kurallarını
açıklamak için kullanılan metalar veya semboller birbirine kural olarak bağlanır. Bu kural setleri, bir dildeki
doğru cümlelerin yapılarını belirtir.
BNF'nin temel amacı, bir dilin yapısal özelliklerini tanımlamak ve anlamak için bir standart sağlamaktır.
BNF'nin kullanılması, programlama dillerinin sentaksının ve yapılarının açıklanmasında, dil işleme
sistemlerinin geliştirilmesinde ve iletişim protokollerinin belirlenmesinde yaygın olarak kullanılır.
Sözdizimsel listeler, özyinelemeli olarak tanımlanır. Bir türeme, kuralların tekrar tekrar uygulanmasıdır;
başlangıç sembolüyle başlar ve bir cümle (tamamen terminal sembollerden oluşan) ile biter.
Yukarıdaki tanımda, <ident_list> sembolü, bir veya daha fazla tanımlayıcı içeren bir listedir. Bu listedeki
tanımlayıcılar virgülle ayrılmıştır. Tanımlama, tek bir tanımlayıcıdan (ident) veya bir tanımlayıcıdan sonra
virgül ve ardından başka bir <ident_list>'in gelmesinden oluşur. Bu kural, bir özyineleme (rekürsif)
kuralıdır; çünkü <ident_list> sembolü, kendisini içerebilir, böylece tanımlayıcı listesi sonsuz uzunlukta
olabilir.

Non-terminal semboller: BNF soyutlamalarıdır ve genellikle < ve > arasında gösterilir. Bunlar dilin

yapısını temsil eder ve başka sembollerle (terminal veya başka non-terminal sembollerle)
birleştirilebilir.
Terminal semboller: Metin veya simgelerdir ve dildeki en küçük yapısal birimleri temsil ederler.
Genellikle açıkça tanımlanmıştır ve non-terminal semboller tarafından kullanılırlar.
Anahtar Semboller: < > | → gibi sembollerdir. < ve > non-terminal sembollerini, | alternatifleri ve →

ise kuralların (rules) sol ve sağ yanlarını ayırmak için kullanılır.


Gramer: Bir dilin kurallarını içeren bir koleksiyondur. Her bir kural bir sol taraf (LHS) ve bir sağ taraf
(RHS) içerir. Sol taraf, bir non-terminal sembolüdür ve sağ taraf terminal ve/veya non-terminal
sembollerle birleştirilmiş bir ifade içerir.
BNF kural örnekleri: Örnek olarak <ident_list> ve <if_stmt> gibi. Bu kurallar, bir dilin yapısal
bileşenlerini tanımlar ve bir non-terminal sembolünün bir veya daha fazla terminal veya non-terminal
sembol ile nasıl birleştirileceğini belirtir.
Bir kuralın sol tarafı (LHS) ve sağ tarafı (RHS): Sol taraf, bir non-terminal sembolüdür ve sağ taraf,
bir terminal veya non-terminal sembollerin bir kombinasyonudur. Bir kuralın birden fazla RHS'si
olabilir, bu nedenle bir non-terminal sembol, farklı yapısal özellikleri ifade etmek için çeşitli
kombinasyonlarla eşleştirilebilir.
Bu gramer, basit bir ifade dilini tanımlar. Aşağıdaki şekilde özetleyebiliriz:

<program>: Programın başlangıcını ifade eder ve bir dizi ifade içerir.


<stmts>: İfadelerin bir listesini tanımlar. Her ifade bir sonrakine noktalı virgülle ayrılır.
<stmt>: Tek bir atama ifadesini tanımlar. Bir değişkenin bir ifadeye atandığı temel formdur.
<var>: Değişkenleri temsil eder. Bu dilde "a", "b", "c" ve "d" olarak dört değişken tanımlanmıştır.
<expr>: İfadelerin temel bileşenidir. İki terimi (term) toplama veya çıkarma işlemi ile birleştirir.
<term>: Bir değişken veya sabit ifade eder.

Örneğin, "a = b + 5;" gibi bir ifade, bu gramerde geçerli bir ifadedir. Bu ifade, bir atama ifadesidir, çünkü bir
değişken "a", bir ifade "b + 5" ile atanır.
Bu türetilmiş örnek, verilen grameri kullanarak bir program ifadesinin nasıl oluşturulabileceğini gösterir.
Başlangıçta, <program> non-terminali bir <stmts> non-terminaline türetilir. Sonra, <stmts> non-terminali bir
<stmt> non-terminaline türetilir ve devam eder.
Sonuç olarak, "a = b + const" ifadesi, gramerde tanımlandığı şekilde türetilir. Bu türetilmiş ifade, bir program
içinde bir atama ifadesini temsil eder: "a" değişkeni, "b" değişkenine bir sabit eklenerek değerlendirilir.
Genişletilmiş BNF (EBNF), BNF'yi daha güçlü bir dil tanımlama aracı haline getiren bazı ek özellikler içerir.
Bu özellikler, daha karmaşık yapıları ve kuralları tanımlamak için kullanışlıdır. İşte bazı yaygın EBNF
öğeleri:

1. İsteğe Bağlı (Optional) [ ]: Bu özellik, parantez içindeki sembolün mevcut olabileceğini ancak zorunlu
olmadığını belirtir. Örneğin, <proc_call> -> ident [(<expr_list>)] kuralında, ifade listesi
(<expr_list>) opsiyoneldir.
2. Alternatifler (Alternative) ( | ): Bu özellik, birden fazla seçenek arasında seçim yapmamızı sağlar.
Örneğin, <term> → <term> (+|-) const kuralında, bir terim bir sabitle toplanabilir veya çıkarılabilir.
3. Tekrarlar (Repetitions) { }: Bu özellik, bir sembolün birden çok kez tekrarlanabileceğini belirtir. { }
içindeki sembolün sıfır veya daha fazla kez olabileceğini ifade eder. Örneğin, <ident> → letter
{letter|digit} kuralında, tanımlayıcı bir harfle başlar ve ardından harf veya rakamdan oluşan bir
dizeyi ifade eder. Tanımlayıcı, sadece bir harfle de olabilir veya birden çok harf ve rakam içerebilir.

Anlamları tanımlamak için geniş kabul görmüş tek bir notasyon veya formalizm yoktur.

Operational semantics-İşlemci Semantiği


Bir programın anlamını, ifadelerini bir makinede, ya da simüle edilmiş veya gerçek bir makinede çalıştırarak
tanımlar. Makinenin durumundaki (bellek, kayıtlar, vb.) değişiklik, ifadenin anlamını belirler.

Yüksek seviye bir dil için işlemci semantiğini kullanmak için bir sanal makineye ihtiyaç vardır.Tam bir
bilgisayar simülasyonu iyi bir çözümdür.İşlem şu şekildedir:Bir çevirmen oluşturun (kaynak kodunu idealize
edilmiş bir bilgisayarın makine koduna çevirir)İdealize edilmiş bilgisayar için bir simülatör oluşturunİşlemci
semantiğinin değerlendirilmesi:Resmi olmayan şekilde kullanıldığında iyi sonuç verir (dil kılavuzları
vb.)Resmi olarak kullanıldığında son derece karmaşık olabilir (örneğin, VDL), PL/I'nin semantiğini
açıklamak için kullanılmıştır.
Aksiomatik Semantik
Formal mantığa dayanır (özne kavramı)
Orijinal amacı: programın resmii doğrulaması
Her dildeki ifade türü için aksiyomlar veya çıkarım kuralları tanımlanır (ifadelerin başka ifadelerle
dönüşümlerine izin vermek için)Bu ifadeler, önermeler olarak adlandırılır.

Bir ifadenin önünde (önkoşul) ifadenin yürütülme noktasında doğru olan değişkenler arasındaki ilişkileri ve
kısıtlamaları ifade eder.Bir ifadenin sonrasında gelen bir ifade ise bir son koşuldur.En zayıf önkoşul, son
koşulu garanti eden en az kısıtlayıcı (en genel) önkoşuldur.

Bu ifadeler, bir programın belirli bir noktasında değişkenler arasındaki ilişkileri ve kısıtlamaları ifade eder.
Önkoşul, bir ifadeyi çalıştırmadan önce geçerli olan koşulları belirtirken, sonkoşul, ifadenin
çalıştırılmasından sonra geçerli olması gereken koşulları belirtir. En zayıf önkoşul, sonkoşulu sağlayacak en
az kısıtlayıcı (en genel) önkoşuldur.
Örneğin, "a = b + 1" ifadesi için sonkoşul "a > 1" olarak verilmişse, bu durumda olası bir önkoşul "b > 10"
olabilir. Ancak, en zayıf önkoşul "b > 0" olacaktır, çünkü bu koşul, sonkoşulu sağlayacak en genel koşuldur.
Bu, ifadenin çalışması için gereken minimum gereksinimleri ifade eder.
Programın genel sonkoşulu, istenen sonucu ifade eder. Programın başından geriye doğru çalışarak, ilk
ifadenin önkoşulu program özellikleri ile aynı ise, program doğrudur. Bu, programın doğruluğunu kanıtlamak
için kullanılan bir yöntemdir ve genellikle formel doğrulama süreçlerinde kullanılır.

Aksiyomatik Semantiğin Değerlendirilmesi


Bir dildeki tüm ifadeler için aksiyomlar veya çıkarım kuralları geliştirmek zordur. Doğruluk kanıtları için iyi
bir araçtır ve programlar hakkında düşünme için mükemmel bir çerçeve sağlar, ancak dil kullanıcıları ve
derleyici yazarları için o kadar yararlı değildir. Bir programlama dilinin anlamını açıklamak için
kullanılabilirliği sınırlıdır.

Denotational Semantik
, özyinelemeli fonksiyon teorisine dayanır ve en soyut anlam açıklama yöntemidir. Başlangıçta Scott ve
Strachey (1970) tarafından geliştirilmiştir.

Bir dil için bir denotasyonel spesifikasyon oluşturma süreci şu adımları içerir:

1. Her dil öğesi için bir matematiksel nesne tanımlama.


2. Dil öğelerinin örneklerini karşılık gelen matematiksel nesnelerin örneklerine eşleyen bir fonksiyon
tanımlama.
3. Dil yapılarının anlamları, programın değişkenlerinin değerlerinden sadece tanımlanır.

Operational Semantics ve Denotational Semantics'in temel farkı, bir programın anlamını tanımlama
yaklaşımlarının doğasıdır.

1. Operasyonel Semantik:Operasyonel semantikte, bir programın anlamı, programın her bir ifadesinin ve
işleminin nasıl çalıştığını tanımlayan kodlanmış algoritmalar aracılığıyla belirlenir. Bu algoritmalar,
genellikle bir sanal makine üzerinde programın adımlarının nasıl yürütüleceğini belirler. Bu yaklaşım,
bir programın nasıl çalıştığını doğrudan modellemeye dayanır ve adımların açık bir şekilde
tanımlandığı bir simülasyon gerektirir.
2. Denotasyonel Semantik:Denotasyonel semantikte, bir programın anlamı, matematiksel nesneler ve
fonksiyonlar aracılığıyla tanımlanır. Her dil yapısı için bir matematiksel nesne tanımlanır ve ardından
bu yapının semantik işlevi, dil yapısındaki değerlerin matematiksel nesnelere nasıl eşleneceğini
tanımlar. Bu yaklaşım, bir programın anlamını matematiksel olarak analiz etmeye dayanır ve daha
soyut ve genel bir açıklama sunar.
Özetle, operasyonel semantik bir programın adımlarını doğrudan modellerken, denotasyonel semantik bir
programın anlamını matematiksel nesneler ve fonksiyonlar aracılığıyla ifade eder.

Denotational Semantics'in değerlendirilmesi şu şekildedir:

1. Programların doğruluğunun kanıtlanması: Denotasyonel Semantik, programların doğruluğunu


kanıtlamak için kullanılabilir. Matematiksel nesneler ve fonksiyonlar aracılığıyla ifade edilen anlamlar,
programların istenen özelliklere sahip olduğunu kanıtlamak için kullanılabilir.
2. Programların düşünülmesi için kesin bir yol sağlar: Denotasyonel Semantik, programların anlamını
matematiksel olarak analiz etmeye dayanır. Bu, program geliştiricilerine ve dil tasarımcılarına
programların nasıl çalıştığını kesin bir şekilde anlamak için sağlam bir çerçeve sunar.
3. Dil tasarımına yardımcı olabilir: Denotasyonel Semantik, dil yapısının derinlemesine anlaşılmasına ve
dilin daha tutarlı ve güçlü bir şekilde tasarlanmasına yardımcı olabilir. Dil tasarımcıları, denotasyonel
semantik analizi kullanarak dil yapılarının niçin belirli şekillerde tanımlanması gerektiğini anlayabilir
ve bu bilgiyi dilin tasarımı ve gelişimi sürecine dahil edebilir.
4. Derleyici üretim sistemlerinde kullanılabilir: Denotasyonel Semantik, derleyici üretim sistemlerinde
dilin derlenmesi ve anlamının çıkarılması için kullanılabilir. Matematiksel olarak sağlam bir temel
sağladığı için, dilin semantiğinin tanımlanması ve çıkarılması sürecine katkıda bulunabilir.

Ancak, Denotasyonel Semantik'in karmaşıklığı, genellikle dil kullanıcıları için çok az yarar sağlar.
Matematiksel nesneler ve fonksiyonlarla çalışma, tipik programcılar için genellikle aşırı karmaşık ve
zorlayıcı olabilir. Bu nedenle, genellikle dil kullanıcılarına yönelik açıklamalar ve araçlar daha uygun olabilir.

You might also like