You are on page 1of 68

Bölüm 3

Söz Dizilimi ve
Anlamı Tanımlama

ISBN 0-321-49362-1
Bölüm 3 Konular
• Giriş
• Söz Dizimi Tanımlamadaki Genel Problem
• Söz Dizimi Tanımlamanın Biçimsel
Yöntemleri
• Gramerlerin özellikleri
• Programların Anlamlarını Tanımlama:
Dinamik Anlamlar

Resul Kara
• Giriş

• Bir programlama dilinin özlü ve anlaşılır bir tanımını yapma görevi zor ancak dilin
başarısı için gereklidir
• ALGOL 60 ve ALGOL 68 kısa açıklamalar kullanılarak sunulan ilk dillerdir
• Bazı diller, biraz daha farklı lehçelere sahip olma sorunu yaşadı; bunun nedeni,
basit fakat resmi olmayan ve kesin olmayan tanımın bir sonucudur
• Bir dili tanımlamadaki sorunlardan biri, açıklamayı anlaması gereken kişilerin
çeşitliliğidir:
– ilk değerlendiriciler, uygulayıcılar ve kullanıcılar (son kullanıcılar)
• Çoğu yeni programlama dili, tasarımlarının tamamlanmasından önce, tasarımıcı
kuruluştaki kullanıcılar tarafından incelenir. Bunlara ilk değerlendiriciler denir.
• Programlama dili uygulayıcılarının bir dildeki ifadelerin ve program birimlerinin
nasıl oluşturulduğunu ve yürütülürken amaçlanan etkilerini belirleyebilmesi
gerekir
• Dil kullanıcıları, bir dil referans el kitabına başvurarak yazılım çözümlerini nasıl
kodlayacaklarını belirleyebilmelidir. Ders kitapları ve dersler bu sürece girer ancak
dil el kitapları genellikle bir dil hakkında yalnızca basılı bilgi kaynağıdır
• Programlama dilleri için yapılan çalışmalar, doğal dil çalışmaları gibi, sözdizimi ve
anlambilim alt başlıklarına ayrılabilir
• Bir programlama dili sözdizimi, ifadeler ve program birimleridir
• Dilin semantiği, bu ifadelerin ve program birimlerinin anlamıdır

Resul Kara
• Giriş

• Türkçe, İngilizce gibi doğal diller veya Java, C gibi yapay diller, alfabedeki karakter
dizelerinin bir dizisidir
• Bir dildeki karakter dizelerine cümleler veya deyimler denir
• Dilin sözdizimi kuralları, dilin alfabesindeki hangi karakter dizelerinin sıralanacağını
belirtir
• Örneğin, Türkçe’de, cümlelerin sözdizimini belirten çok sayıda karmaşık kurallar vardır
• En büyük ve en yaygın kullanılan programlama dilleri bile doğal dillerle
karşılaştırıldığında sözdizimsel olarak çok basittir
• Programlama dillerinin sözdiziminin biçimsel tanımlamaları çoğu zaman en düşük
seviyedeki söz dizimi birimlerinin açıklamalarını içermez
• Bu küçük birimlere lexem (sözcük) adı verilir
• Sözcüklerin tanımı, genellikle sözdizimsel tanımdan ayrı olan bir yapı ile oluşturulur
• Bir programlama dili lexemlar, sayısal literaller, operatörler ve özel kelimeler içerir
• Programları, karakter dizelerinden çok lexem dizeleri olarak düşünebiliriz
• Lexemler çeşiti gruplara ayrılmıştır:
– Değişkenler
– Metotlar
– Sınıflar
– Dildeki özel kelimeler
• Her lexem grubu bir isim veya simge ile temsil edilir. Bu simgelere lexem’ın kategorisi
(token) denir.
Resul Kara
• Giriş

• Söz dizimi (syntax): ifadeler, anlatımlar ve


program birimlerinin yapı ya da şekli
• Anlambilim (semantics): ifadelerin,
anlatımların ve program birimlerinin anlamı
• Söz dizimi ve anlambilim bir dilin tanımını
verir
– Bir dil tanımının kullanıcıları
• Diğer dil tasarımcıları
• Uygulayıcılar
• Programcılar(dilin kullanıcıları)

Resul Kara
Söz Dizimi Tanımlama: Terminoloji

• Cümle alfabelerdeki karakterlerden oluşan


dizi
• Dil cümleler kümesidir
• Sözcük (lexeme) dilin en alt seviye söz
dizimsel birimi (örnek: *, sum, begin)
• Sembol (token) Sözcüklerin türü,
kategorisidir (ör, belirleyici-identifier)

Resul Kara
Dillerin Biçimsel Tanımı

• Bir dilin tanımı iki yolla yapılır:


• Tanıyıcılar (Recognizers)
– Bir tanıma aracı dilin girdi dizilerini okur ve
girilen diziler o dile ait mi değil mi karar verir
– Örnek: bir derleyicinin sözdizimi analizi kısmı
• Üreticiler (Generators)
– Bir dilin cümlelerini üreten araç
– Bir kimse belli bir cümlenin söz diziliminin
doğru olup olmadığına onu üreticinin yapısıyla
karşılaştırarak karar verebilir

Resul Kara
Söz Dizilimi Tanımlamanın Biçimsel
Yöntemleri
• Backus-Naur Form(BNF) ve Bağlamdan Bağımsız
Gramer (Context-Free Grammar)
– Programlama dilinin söz dizimini tanımlamada çok iyi
bilinen yöntem
– 1950'lerin ortalarında, Noam Chomsky ve John Backus,
aynı sözdizimi açıklama biçimini geliştirdiler; daha sonra
sözdizimi açıklama biçimlemesi programlama dilinin en
yaygın kullanılan yöntemi haline geldi.
• Genişletilmiş (Extended) BNF-EBNF
– BNF’nin okunabilirlik ve yazılabilirliğinin geliştirilmiş şekli
• Gramerler ve Tanıyıcılar(Recognizers)

Resul Kara
BNF ve Bağlamdan Bağımsız
(Context-Free) Gramerler

• Bağlamdan Bağımsız Gramerler


– Noam Chomsky tarafından 1950’lerin ortalarında
geliştirildi
– Dört dil sınıfını tanımlayan dört gramer sınıfı tanımladı
– Bağlam içermeyen ve düzenli olarak adlandırılan bu
dilbilgisi sınıflarından ikisi, programlama dillerinin
sözdizimini açıklamak için kullanışlı oldukları ortaya çıktı
– Küçük istisnalarla birlikte tüm programlama dillerinin
sözdizimi bağlamsız dilbilgisi ile açıklanabilir
– Chomsky bir dilbilimci olduğu için, birincil ilgi doğal
dillerin teorisi üzerine çalıştı, programlama dilleri ile ilgisi
yoktu
– Dil üreticileri, doğal dillerin söz dizimini tanımlama için
kullandılar
Resul Kara
Backus-Naur Form (BNF)

• Backus-Naur Form(1959)
– John Backus tarafından Algol 58’i tanımlamak
için icat edildi
– BNF bağlamdan bağımsız gramere denktir
– BNF diğer dilleri tanımlamada kullanılan bir
metadildir.
– BNF’de söz dizimsel yapıların sınıflarını
göstermek için soyutlamalar kullanılır: Bunlar
söz dizimsel değişkenler gibi davranırlar
– Bu yapıya nonterminal semboller denir

Resul Kara
BNF Temelleri

• Non-terminaller: BNF soyutlamaları


• Terminaller: sözcükler ve jetonlar
• BNF, sözdizimsel yapılar için soyutlamalar
kullanır. Örneğin, basit bir Java atama ifadesi,
<assign> → <var> = <expression>
<assign> soyutlaması ile temsil edilebilir
<> parantezler soyutlamaları
• Gramer: kurallar bütünü
– BNF kurallarının örnekleri:
<ident_list> → identifier | identifier,<ident_list>
<if_stmt> → if <logic_expr> then <stmt>
Resul Kara
BNF Kuralları

• Bir kuralın sol tarafı (LHS) ve sağ tarafı (RHS) vardır


• Kural, terminal ve nonterminal semboller içerir
• LHS, non-terminalden oluşur
• RHS, non-terminal veya terminal (tokenlar veya
lexemlar) içerir
• Gramer, sonlu, boş olmayan kurallar kümesidir
• Bir soyutlama (ya da non-terminal sembol) birden
fazla sağ tarafa sahip olabilir
<stmt> ® <single_stmt>
| begin <stmt_list> end

Resul Kara
BNF Kuralları

• Örnek olarak bir Java if yapısının kuralı şöyle


<if_stmt> → if ( <logic_expr> ) <stmt>
<if_stmt> → if ( <logic_expr> ) <stmt> else
<stmt>
• Veya:
<if_stmt> → if ( <logic_expr> ) <stmt>
| if ( <logic_expr> ) <stmt> else <stmt>

Resul Kara
Listeleri Tanımlama

• Söz dizimsel listeler özyineleme


kullanılarak tanımlanırlar
<ident_list> ® ident
| ident, <ident_list>

• Bir derivasyon, kuralların, başlama sembolünden


başlayıp bir cümle ile biten tekrarlı uygulamasıdır

Resul Kara
Gramer ve Derivasyon

• Gramer, dilleri tanımlamak için kullanılan bir


araçtır
• Dilin cümleleri, başlangıç sembolü adı verilen
gramerin non-terminallerinden başlayarak,
kuralların bir dizi uygulaması yoluyla oluşturulur
• Bu kural uygulamalarına türetme (derivasyon) denir
• Bir programlama dili için bir gramer başlangıç
simgesi komple bir programı temsil eder ve
genellikle <program> gösterimiyle ifade edilir
• Bir derivasyon, kuralların, başlama sembolünden
başlayıp bir cümle ile biten tekrarlı uygulamasıdır

Resul Kara
Örnek Bir Gramer

<program> ® <stmts>
<stmts> ® <stmt> | <stmt> ; <stmts>
<stmt> ® <var> = <expr>
<var> ® a | b | c | d
<expr> ® <term> + <term> | <term> - <term>
<term> ® <var> | const

Ok işaretine dikkat ediniz!


Stmts: Komutlar, program içindeki komut satırları
Stmt: Bir tek komut, bir tek komut satırı
Var: Değişken
Expr: İfade
Term: Terim
Const: Sabit (3 veya 17 gibi)

Resul Kara
Örnek Bir Derivasyon

<program> => <stmts> => <stmt>


=> <var> = <expr> => a =<expr>
=> a = <term> + <term>
=> a = <var> + <term>
=> a = b + <term>
=> a = b + const

Ok işaretine dikkat ediniz!

Resul Kara
Derivasyon

• Derivasyondaki sembollerin her dizisi


cümleye ait bir formdur
• Bir cümle sadece terminal sembolleri,
sabitleri veya değişken adlarını içeren
cümlesel bir formdur
• Her cümlesel formdaki açıklanacak en sol
non-terminalin olduğu derivasyon, en sol
derivasyondur
• Cümleler en-sağ non-terminaller şeklinde
de oluşturulabilir
Resul Kara
Bir Başka Gramer Örneği

Gramer 2:

<program> → begin <stmt_list> end


<stmt_list> → <stmt> | <stmt> ; <stmt_list>
<stmt> → <var> = <expression> <var> →A|B|C
<expression> → <var> + <var> | <var> – <var> | <var>

Resul Kara
Gramer 2’nin Derivasyon Örneği

<program> => begin <stmt_list> end


=> begin <stmt>;<stmt_list>end
=> begin <var>=<expression>;<stmt_list>end
=> begin A = <expression> ; <stmt_list> end
=> begin A = <var> + <var> ; <stmt_list> end
=> begin A = B + <var> ; <stmt_list> end
=> begin A = B + C ; <stmt_list> end
=> begin A = B +C ;<stmt>end
=> begin A = B + C ; <var> = <expression> end
=> begin A = B +C ;B =<expression>end
=> begin A = B +C ;B =<var>end
=> begin A =B +C ;B = C end

Resul Kara
Bir Başka Gramer Örneği

Gramer 3: Basit atama ifadesinin grameri

<assign> → <id> = <expr>


<id> → A|B|C
<expr> → <id> + <expr> | <id> * <expr> |( <expr> )| <id>

SORU: A =B*(A+C) ifadesi bu gramere göre doğru mu?

assign: Assisgnment, atama (sağ taraf işlemlerinin sol tarafa)


id: identifier-tanımlayıcı, değişken adı, metot adı gibi

Resul Kara
Gramer Ayrıştırma Ağacı

• Gramerlerin en önemli özelliklerinden biri, tanımladıkları dillerin


cümlelerinin hiyerarşik sözdizimsel yapısını doğal olarak
tanımlamalarıdır
• Bu hiyerarşik yapılara ayrıştırma ağaçları denir
• Ayrıştırma ağaçları düğümlerden, dallardan ve yapraklardan oluşur
• Ayrıştırma ağacının her düğümü bir non-terminal sembolle
etiketlenir
• Her yaprak bir terminal simgesi ile etiketlenir
• Ayrıştırma ağacının her alt ağacı, cümledeki bir soyutlamanın bir
örneğini açıklar

Resul Kara
Gramer Ayrıştırma Ağacı

<program>

<stmts>

<stmt>

<var> = <expr>

a <term> + <term>

<var> const

b
Resul Kara
Gramer Ayrıştırma Ağacı

Resul Kara
Gramerlerde Belirsizlik

• İki veya daha fazla ayrı ayrıştırma ağacına


sahip bir cümlecik formu üreten bir gramer
belirsizdir (ambigious)
• Belirsizlik bir ifadenin birden fazla anlama
gelmesi durumunda söz konusu olur
• Gramerde belirsizliği tespit etmek için bir
cümle iki ayrı ayrıştırma ağacı ile
oluşturulmaya çalışılır. Eğer
oluşturulabilirse gramer belirsizdir

Resul Kara
Belirsiz İfadeli Bir Gramer

<assign> → <id> = <expr>


<id> →A|B|C
<expr> → <expr>+<expr> | <expr>*<expr> |( <expr> ) | <id>

Bu gramer belirsizdir! Neden?

Resul Kara
Kesin İfadeli Bir Gramer

• Eğer gramerde operatörlerin öncelik


seviyesini değerlendirilmişse belirsizlik
olmaz
<assign> → <id> = <expr>
<id> →A|B|C
<expr> → <expr> + <term> | <term>
<term> → <term> * <factor> | <factor>
<factor> → ( <expr> ) | <id>

Bu gramer belirli midir? Örnek bir cümle için değerlendiriniz!


Örnek cümle de benden olsun: A = B + C * A

Resul Kara
Operatörlerin Birlikteliği

• Operatörlerin birlikteliği
gramerlerle de
gösterilebilir
• Operatörlerin birlikteliği,
aynı öncelik seviyesine
sahip operatörlerin yan
yana gelmesi durumunda
oluşur
• Örnek: A/B/C

Resul Kara
Genişletilmiş BNF

• BNF'de birkaç küçük eksiklikten dolayı, çeşitli


şekillerde genişletilmiştir
• BNF’nin üzerine özellik ilaveleri yapılmış
versiyonuna Genişletilmiş BNF (Extended BNF) veya
kısaca EBNF denir
• Genişletmeler BNF'nin gramer tanımlama gücünü
arttırmaz; sadece BNF’nin okunabilirliğini ve
yazılabilirliğini kolaylaştırır
• EBNF'nin çeşitli sürümlerinde yaygın olarak üç
genişletme bulunur

Resul Kara
Genişletilmiş BNF

• Seçmeli kısımlar kare parantezler [] arasına


yerleştirilir
<proc_call> -> ident [(<expr_list>)]
• Sağ tarafların alternatif kısımları normal
parantezler arasına dikey çizgi ile ayrılarak
yerleştirilir
<term> → <term> (+|-) const
• Tekrarlar (0 veya daha fazla tekrar) kıvırcık
parantez {} içine yerleştirilir
<ident> → letter {letter|digit}

Resul Kara
BNF ve EBNF

• BNF
<expr> ® <expr>+<term> | <expr>-<term> | <term>
<term> ® <term> * <factor> | <term> / <factor>
| <factor>
• EBNF
<expr> ® <term> {(+ | -) <term>}
<term> ® <factor> {(* | /) <factor>

Resul Kara
BNF ve EBNF

• BNF
<expr> → <expr> + <term> | <expr> - <term> | <term>
<term> → <term> * <factor> | <term> / <factor> | <factor>
<factor> → <exp> ** <factor> <exp>
<exp> → (<expr>) |id

• EBNF
<expr> → <term> {(+ | -) <term>}
<term> → <factor> {(* | /) <factor>}
<factor> → <exp> { ** <exp>}
<exp> → (<expr>) |id

Resul Kara
Öznitelik (Attribute) Gramerleri

• Bağlamdan bağımsız gramerler (CFGs) programlama dillerinin


tüm söz dizimini tanımlayamaz
• Öznitelik grameri, bir programlama dilinin yapısını daha fazla
tanımlamak için kullanılan, bağlamdan bağımsız gramer ile
tanımlanabilen bir aygıttır
• Öznitelik grameri, bağlamdan bağımsız gramerin bir
uzantısıdır
• Bu sayede tür uyumluluğu gibi belirli dil kurallarının rahatça
tanımlanması sağlanır
• Öznitelik gramerini tanımlayabilmek için statik anlambilim ve
statik anlam kontrolü kavramlarının tanımına ihtiyaç vardır
• Ayrıştıma ağaçları boyunca bazı anlamsal bilgileri taşımak
için CFG’lere eklemeler yapılır

Resul Kara
Statik Anlambilim

• BNF ile bir dilin tüm yapısını tanımlamak zordur belki de


imkansızdır
• Örneğin, tür kontrolü konusunda; Java'da, bir floating-point değer
bir tamsayı değişkene atanamaz, tersi doğru olmasına rağmen
• Bu kısıtlama BNF'de belirtilmesine rağmen, ek non-terminal
semboller ve kurallar gerektirir
• Java'nın tüm yazım kuralları BNF'de belirtilmiş olsaydı, gramerin
boyutu çok büyük olurdu
• BNF'de belirtilemeyen bir sözdizimi kuralı örneği: “Değişkenlerin
kullanılmadan önce bildirilmesinin zorunlu olduğu kuralı”. Bu
kuralın BNF’de bildirilemediği kanıtlanmıştır
• BNF ile tanımlanamayan veya tanımlanması çok zor olan kurallar,
statik semantik kuralları adı verilen dil kuralları kategorisindedir
• Bir dilin statik semantiği, yürütme sırasındaki programların
anlamıyla doğrudan doğruya ilişkilidir

Resul Kara
Statik Anlambilim

• Bir dildeki birçok statik anlamsal kural, tür kısıtlamalarını belirtir


• Bu kuralların analizi derleme zamanında yapıldığı için adına Statik
semantik denmiştir
• BNF ile statik anlambilim tanımlayamama problemleri nedeniyle, bu
görev için çeşitli daha güçlü mekanizmalar tasarlanmıştır. Böyle bir
mekanizma olan öznitelik grameri, Knuth tarafından hem
programların sözdizimini hem de statik semantiği tanımlamak üzere
tasarlanmıştır
• Öznitelik grameri, bir programın statik semantik kurallarının
doğruluğunu tanımlamak ve kontrol etmek için resmi bir
yaklaşımdır
• Derleyici tasarımında her zaman resmi bir biçimde kullanılmasalar
da, öznitelik gramerinin temel kavramları en azından her derleyicide
gayri resmi olarak kullanılır
• Deyimlerin, ifadelerin ve program birimlerinin anlamı olan sematik
türü dinamik semantiktir
Resul Kara
Öznitelik Gramerleri

• Öznitelik grameri, niteliklere, hesaplama fonksiyonlarına ve


doğrulama fonksiyonlarına eklenen bağlamdan bağımsız
gramerlerdir
• Gramer simgeleriyle (terminal ve nonterminal simgeler)
ilişkilendirilen özellikler, değişkenlere, kendilerine atanmış
değerlere sahip olabilecekleri şekilde benzer niteliktedir
• Nitelik hesaplama fonksiyonları, bazen anlamsal işlevler olarak
adlandırılır ve gramer kurallarıyla ilişkilendirilir
• Özellik değerlerinin nasıl hesaplandığını belirtmek için kullanılırlar.
• Dilin statik semantik kurallarını belirleyen doğrulama fonksiyonları
grmaer kurallarıyla ilişkilendirilir

Resul Kara
Öznitelik Gramerleri: Tanım

• Bir nitelik grameri aşağıdakilerle birlikte


bağlamdan bağımsız bir gramerdir
– Her X gramer sembolü için nitelik değerlerinin bir A(X)
kümesi vardır. A(X) kümesi iki ayrık küme olan S(X) ve I(X)
den oluşur.
• S(X): Sentezlenmiş nitelik: Sentezlenen öznitelikler
ayrıştırma ağacına yukarı yönde semantik bilgi
aktarmak için kullanılır
• I(X): Kalıt alınmış nitelik: Miras alınan öznitelikler
anlam bilgisi bilgilerini aşağı yönde bir ağaca aktarır
– Her bir kuralın kuraldaki non-terminallerin belli
niteliklerini tanımlayan fonksiyonlar kümesi vardır
– Her kuralın, niteliklerin tutarlılıklarını kontrol etmek üzere
belirteçler kümesi vardır
Resul Kara
Öznitelik Gramerleri: Tanım

• Her gramer kuralı ile ilişkili olarak, gramer kuralındaki simgelerin


nitelikleri üzerinde bir dizi semantik fonksiyon ve muhtemelen boş
bir doğrulama fonksiyonu kümesi vardır
• Bir kural X0 S X1 c Xn için, X0’ın sentetik boyutlu öznitelikleri, S (X0)
= f (A (X1), c, A (Xn)) biçimindeki semantik fonksiyonlarla hesaplanır
• Ayrıştırma ağacı düğümünde sentezlenen bir öznitelik değeri
yalnızca o düğümün alt öğelerindeki öznitelik değerlerine bağlıdır.
– Xj, 1 ... j ... n sembollerinin (yukarıdaki kuralda) devralınan nitelikleri,
– I(Xj) = f (A (X0), c, A (Xn)) formundaki semantik bir fonksiyon ile hesaplanır
• Ayrıştırma ağacı düğümünde kalıtsal bir öznitelik değeri, o
düğümün kendine özgü düğümünün ve onun kardeş düğümlerinin
özellik değerlerine bağlıdır. Döngüselliğin önüne geçmek için
kalıtsal nitelikler genellikle
– I(Xj) = f (A (X0), c, A (X (j-1)) formundaki fonksiyonlarla sınırlandırılmıştır
• Bu form, miras alınmış bir özniteliğin kendisine veya ayrıştırma
ağacındaki sağdaki niteliklere bağlı kalmasını önler

Resul Kara
Öznitelik Gramerleri: Tanım

• Bir doğrulama fonksiyonu, {A (X0), c, A (Xn)} öznitelikleri birleşimi


ve bir literal öznitelik değerleri kümesi üzerinde bir Boolean ifadesi
biçimindedir.
• Bir öznitelik grameri ile izin verilen tek bir derivasyon (her
nonterminal bir doğrulama fonksiyonu ile ilişkilidir) doğrudur (true).
Sonucu yanlış (false) olan bir doğrulama fonksiyonu, sözdiziminin
veya dilin statik anlam kuralının ihlal edildiğini gösterir.
• Öznitelik gramerinin bir ayrıştırma ağacı, muhtemelen boş olan her
düğüme eklenen öznitelik değerleri kümesiyle birlikte, alttaki BNF
dilbilgisine dayanan ayrıştırma ağacından oluşur
• Ayrıştırma ağacındaki tüm öznitelik değerleri hesaplandıysa, ağacın
tamamen özelliklendirildiği söylenir
• Uygulamada her zaman bu şekilde yapılmamasına rağmen, öznitelik
değerlerinin, özelliklendirilmemiş ayrıştırma ağacının derleyici
tarafından oluşturulduktan sonra hesaplandığı düşünülür.

Resul Kara
Yapısal Öznitelikler

• Yapısal öznitelikler (Intrinsic attributes), değerleri ayrıştırma


ağacının dışında belirlenen yaprak düğümlerden sentezlenen
öznitelikleridir
• Örneğin, bir programdaki değişken örneğinin türü, değişken
adlarını ve türlerini depolamak için kullanılan sembol tablosundan
gelebilir
• Sembol tablosunun içeriği, daha önceki deklarasyon ifadelerine
dayanarak belirlenir. Başlangıçta, özelliklendirilmemiş ayrıştırma
ağacının yapılandırıldığını ve öznitelik değerlerinin gerekli olduğunu
varsayarak, değerleri olan tek öznitelik, yaprak düğümlerinin öz
nitelikleridir
• Bir ayrıştırma ağacındaki yapısal öznitelik değerleri göz önüne
alındığında, semantik fonksiyonlar kalan öznitelik değerlerini
hesaplamak için kullanılabilir

Resul Kara
Öznitelik Gramerleri: Tanım özeti

• X0 ® X1 ... Xn bir kural olsun


• S(X0) = f(A(X1), ... , A(Xn)) şeklindeki
fonksiyonlar sentezlenmiş nitelikleri
tanımlar
• I(Xj) = f(A(X0), ... , A(Xn)), 1<= j <= n
şeklindeki fonksiyonlar miras kalan
nitelikleri tanımlar
• İlk önce yapraklarda gerçek nitelikler vardır

Resul Kara
Öznitelik Gramerleri: Bir Örnek

• Basit bir atama ifadesinin tür kurallarını denetlemek için bir


öznitelik gramerinin nasıl kullanılacağını gösteriyor
• Bu atama ifadesinin sözdizimi ve statik semantiği şöyledir:
– Değişken adları A, B ve C'dir
– Atamaların sağ tarafı, bir değişken veya bir değişken eklenmiş
bir ifade olabilir
– Değişkenler iki türde olabilir: int veya real
– Bir atamanın sağ tarafında iki değişken olduğunda, aynı tür
olması gerekmez
– İşlenen türleri aynı olmadığında, ifade türü her zaman real olur
– Değişkenler aynı olduğunda ifade tipi, işlenenlerin türüdür
– Atamanın sol tarafının türü, sağ tarafın türüne uygun olmalıdır.
Böylece sağ taraftaki işlenenlerin türleri karışık olabilir
– Ancak atama yalnızca hedef ve sağ tarafın
değerlendirilmesinden elde edilen sonucun değeriyle aynı türde
Resul Kara
olması durumunda geçerlidir
Öznitelik Gramerleri: Örnek

• Söz dizimi
<assign> -> <var> = <expr>
<expr> -> <var> + <var> | <var>
<var> -> A | B | C
• Actual_type(gerçek_tür): <var> ve <expr> için
sentezlenmiştir. Bunlar <var> veya <expr> de int ve real
gerçek türlerini depolamak için kullanılır. Var içinde
saklanırsa, gerçek tür yapısaldır. Expr içinde saklanırsa çocuk
düğümlerin gerçek türlerinden belirlenir
• Expected_type(beklenen_tür): <expr> için mirastır.
Atama ifadesinin sol tarafındaki var’ın türü kullanılarak
belirlenir

Resul Kara
Öznitelik Gramerleri:Örnek (devam)

• Sözdizimi kuralı: <expr> ® <var>[1] + <var>[2]

Anlam kuralı:
<expr>.actual_type ¬ <var>[1].actual_type
Belirteçler:
<var>[1].actual_type == <var>[2].actual_type
<expr>.expected_type == <expr>.actual_type
• Sözdizimi kuralı : <var> ® id

Anlam kuralı :
<var>.actual_type ¬ lookup (<var>.string)

Resul Kara
Öznitelik Gramerleri:Örnek (devam)

• Niteliklerin değerleri nasıl hesaplanıyor?


– Eğer tüm nitelikler miras ise ağaç yukarıdan
aşağıya doğru oluşturulabilir
– Eğer tüm nitelikler sentezlenmiş ise ağaç
aşağıdan yukarıya doğru oluşturulabilir
– Pek çok durumda her iki nitelik çeşidi de
kullanılır ve aşağıdan yukarıya ya da yukarıdan
aşağıya bir kombinasyon kullanılmalıdır

Resul Kara
Öznitelik Gramerleri:Örnek (devam)

<expr>.expected_type ¬ ebeveynden miras

<var>[1].actual_type ¬ lookup (A)


<var>[2].actual_type ¬ lookup (B)
<var>[1].actual_type =?
<var>[2].actual_type

<expr>.actual_type ¬
<var>[1].actual_type
<expr>.actual_type =?
<expr>.expected_type

Resul Kara
Öznitelik Gramerleri:Örnek (devam)

1.Syntax kuralı: <assign> → <var> = <expr>


Semantik kuralı: <expr>.expected_type ← <var>.actual_type
2.Syntax kuralı: <expr> → <var>[2] + <var>[3]
Semantik kuralı: <expr>.actual_type ←
if (<var>[2].actual_type = int) and (<var>[3].actual_type = int)
then int else real
end if
Doğrulama: <expr>.actual_type == <expr>.expected_type
3.Syntax kuralı: <expr> → <var>
Semantik kuralı: <expr>.actual_type ← <var>.actual_type Predicate:
Doğrulama: <expr>.actual_type == <expr>.expected_type
4. Syntax kuralı: <var> →A | B | C
Semantik kuralı: <var>.actual_type ← look-up(<var>.string)
Look-up fonksiyonu verilen bir değişkenin sembol tablosundan
değişken türünü bulur

Resul Kara
Öznitelik Gramerleri:Örnek (devam)

A=A+B için ayrıştırma ağacı

Resul Kara
Öznitelik Gramerleri:Örnek (devam)

Resul Kara
Anlambilim

• Anlamı tanımlamanın geniş ölçekte kabul edilen,


tek bir notasyonu ya da biçimi yoktur
• Bir programlama dilinin anlam (semantic) kuralları,
bir dilde sözdizimsel olarak geçerli olan herhangi
bir programın anlamını belirler
• Anlamsal tanımlama için varolan yöntemler
oldukça karmaşıktır ve hiçbir yöntem sözdizim
tanımlamak için kullanılan BNF metadili gibi yaygın
kullanıma ulaşmamıştır.
• İşlevsel Anlam
– Programın anlamını gerçek olarak ya da simülasyonla,
ifadelerini makine üzerinde çalıştırarak tanımlar.
Makinenin (hafıza, kayıtçılar, vs.) durumundaki değişim
Resul Kara
ifadenin anlamını tanımlar
İşlevsel Anlambilim

• Yüksek seviye bir dil için işlevsel


anlambilimi kullanmak bir sanal makine
gerektirir
• Donanımsal bir saf yorumlayıcı çok pahalı
olurdu
• Yazılımsal bir saf yorumlayıcının da
problemleri var
– Özel bir bilgisayarın detaylı karakteristiği
eylemlerin anlaşılmasını güçleştirebilirdi
– Böyle bir anlambilim tanımlaması makine
bağımlı olurdu
Resul Kara
İşlevsel Anlambilim (devam)

• Daha iyi bir alternatif: bütün bir bilgisayar


simülasyonu
• Süreç:
– Bir çevirici kur (kaynak kodunu ideal bir
bilgisayarın makine koduna çeviren)
– İdeal bir bilgisayar için bir simülatör yap
• İşlevsel anlambilimin değerlendirmesi:
– Eğer gayri resmi kullanılıyorsa (dil kılavuzu, vs)
iyi
– Eğer resmi olarak kullanılıyorsa (ör, VDL)
oldukça karmaşık, o PL/I’ın anlambilimini
tanımlamada kullanılırdı
Resul Kara
Aksiyomatik (Belitsel) Anlambilim

• Biçimsel mantık tabanlı (analize dayalı)


• Asıl amaç: biçimsel program doğrulaması
• Aksiyomlar ya da çıkarım kuralları dildeki
her bir ifade türü için
tanımlanmıştır(ifadelerin başka ifadelere
dönüşümüne izin vermek için)
• İfadelere iddia denir

Resul Kara
Aksiyomatik Anlambilim(devam)

• Bir ifadenin önündeki bir iddia(assertion)


(bir önşart(precondition)), çalıştırıldığı
zaman değişkenler arasında true olan ilişki
ve kısıtları(constraints) belirtir
• Bir ifadenin arkasından gelen iddiaya
sonşart(postcondition) denir
• En zayıf önşart(weakest precondition),
sonşartı garanti eden asgari kısıtlayıcı
önşarttır

Resul Kara
Aksiyomatik Anlamın Biçimi

• Ön-son(Pre-post) biçimi :
{P} ifade {Q}
• Bir örnek: a = b + 1 {a > 1}
Mümkün bir önşart: {b > 10}
En zayıf önşart: {b > 0}

Resul Kara
Program İspat Süreci

• Tüm program için son şart istenen sonuçtur


– Program boyunca ilk ifadeye doğru tersten çalış.
Eğer ilk ifadedeki ön şart programın
tanımlamalarıyla aynı ise program doğrudur

Resul Kara
Aksiyomatik Anlam: Aksiyomlar

• Bir atama ifadesi için aksiyom:


(x = E): {Qx->E} x = E {Q}
• Sonucun kuralı:

{P} S {Q}, P' Þ P, Q Þ Q'


{P' } S {Q'}

Resul Kara
Aksiyomatik Anlam: Aksiyomlar

• Diziler için bir çıkarım kuralı


{P1} S1 {P2}
{P2} S2 {P3}

{P1} S1 {P2}, {P2} S2 {P3}


{P1} S1; S2 {P3}

Resul Kara
Aksiyomatik Anlam: Aksiyomlar

• Mantıksal ön test döngüsü için bir çıkarım kuralı

{P} while B do S end {Q}


(I and B) S {I}
{I} while B do S {I and (not B)}

I: döngü sabiti (tümevarımsal hipotez)

Resul Kara
Aksiyomatik Anlam: Aksiyomlar

• Döngü sabitinin(invariant) özellikleri


I , aşağıdaki şartları sağlamalıdır:
– P => I (döngü değişkeni başlangıçta true olmalı)
– {I} B {I} (Boolean hesabı I’nin doğruluğunu(geçerliliğini)
değiştirmemelidir)
– {I and B} S {I} (Döngü gövdesinin çalıştırılmasıyla I
değişmez)
– (I and (not B)) => Q (I true ise ve B false ise, Q
bulunur(implied))
– Döngü sonlanır (ispatlamak zor olabilir)

Resul Kara
Döngü Sabiti

• Döngü sabiti I döngünün son şartının


zayıflatılmış bir versiyonudur
• I döngünün başlangıcından önce
karşılanmak/sağlanmak/tatmin edilmek
için yeterince zayıf olmalı, ama döngünün
bitiş koşuluyla bütünleştirildiğinde son
şartın doğruluğunu güçlendirmek için
yeterince güçlü olmalı

Resul Kara
Aksiyomatik Anlamın
Değerlendirmesi

• Bir dilde tüm ifadeler için aksiyomlar veya


çıkarım kuralları geliştirmek zordur
• İspatların doğruluğu için iyi bir araç ve
programlar hakkındaki muhakemeler için
kusursuz bir taslaktır, fakat dilin
kullanıcıları ve derleyici yazanlar için
kullanışlı değildir
• Bir programlama dilinin anlamını
tanımlamadaki kullanışlılığı dilin
kullanıcıları ve derleyici yazanlarla sınırlıdır
Resul Kara
Matematiksel Nesnelerle
Anlambilim

• Özyinelemeli fonksiyon teorisi tabanlı


• En soyut anlam tanımlama yöntemi
• İlk kez Scott ve Strachey tarafından
geliştirildi (1970)

Resul Kara
Matematiksel Nesnelerle
Anlambilim (devam)

• Bir dil için denotasyonel şartname


hazırlama süreci. Dilin her birimi için
matematiksel bir nesne tanımla
– Dil birimlerinin örneklerini ilgili matematiksel
nesnelerin örnekleriyle eşleştiren bir fonksiyon
tanımla
• Dil yapılarının anlamı sadece programın
değişkenlerinin değerleriyle tanımlanır

Resul Kara
Denotasyonel-İşlevsel

• İşlevsel anlambilimde durum değişimleri


kodlanan algoritma tarafından tanımlanır
• Denotasyonel (matematiksel nesnelerle)
anlambilimde durum değişimleri kesin
matematiksel fonksiyonlarla tanımlanır

Resul Kara
Döngünün Anlamı

• Döngünün anlamı, hata olmadığı


varsayılarak, program değişkenlerinin
döngüdeki ifadeler istenen sayıda
çalıştıktan sonraki değeridir
• Esas itibariyle, döngü yinelemeden
özyinelemeli kontrolün diğer özyinelemeli
durum eşleştirme fonksiyonları tarafından
matematiksel olarak tanımlandığı
özyinelemeye dönüştürülür
• Özyineleme, yinelemeyle karşılaştırıldığında
matematiksel kesinlikle tanımlaması daha
kolay
Resul Kara
Denotasyonel Anlamın
Değerlendirmesi

• Programların doğruluğunun ispatında


kullanılabilir
• Programlar hakkında düşünmek için kesin
bir yol sağlar
• Dil tasarımına bir yardım olabilir
• Derleyici üretim sistemlerinde kullanılmıştır
• Karmaşıklığı sebebiyle dil kullanıcıları
tarafından çok az kullanılmıştır

Resul Kara
Özet

• BNF ve bağlamdan bağımsız gramerler


meta dillere denk
– Programlama dillerinin sözdizimini tanımlamaya
uygun
• Bir nitelik grameri dilin sözdizimi ve
anlamını tanımlayan betimleyici bir
biçimselliktir
• Anlambilimi tanımlamanın 3 temel yöntemi
– İşlem, aksiyomatik, denotasyonel

Resul Kara

You might also like