Derleyici Tasarımı - Anlamsal Analiz
Bir ayrıştırıcının sözdizimi analizi aşamasında ağaçları nasıl ayrıştırdığını öğrendik. Bu aşamada oluşturulan düz ayrıştırma ağacı, ağacın nasıl değerlendirileceğine dair herhangi bir bilgi taşımadığından genellikle bir derleyici için kullanılmaz. Dilin kurallarını oluşturan bağlamdan bağımsız dilbilgisi üretimleri, bunların nasıl yorumlanacağına uyum sağlamaz.
Örneğin
E → E + T
Yukarıdaki CFG üretiminin onunla ilişkili bir anlam kuralı yoktur ve üretimi anlamlandırmaya yardımcı olamaz.
Anlambilim
Bir dilin anlambilimi, simgeler ve sözdizimi yapısı gibi yapılarına anlam sağlar. Anlambilim, sembolleri, türlerini ve birbirleriyle ilişkilerini yorumlamaya yardımcı olur. Anlamsal analiz, kaynak programda oluşturulan sözdizimi yapısının herhangi bir anlam alıp almadığına karar verir.
CFG + semantic rules = Syntax Directed Definitions
Örneğin:
int a = “value”;
sözcüksel ve yapısal olarak doğru olduğu için sözcük ve sözdizimi analizi aşamasında bir hata vermemeli, ancak ödevin türü değiştikçe anlamsal bir hata oluşturmalıdır. Bu kurallar dilin grameri tarafından belirlenir ve anlambilimsel analizde değerlendirilir. Anlamsal analizde aşağıdaki görevler gerçekleştirilmelidir:
- Kapsam çözümü
- Tip kontrolü
- Diziye bağlı denetim
Anlamsal Hatalar
Anlamsal çözümleyicinin tanıması beklenen bazı anlambilim hatalarından bahsetmiştik:
- Tür uyumsuzluğu
- Bildirilmemiş değişken
- Ayrılmış tanımlayıcının kötüye kullanımı.
- Bir kapsamdaki değişkenin çoklu bildirimi.
- Kapsam dışı bir değişkene erişiliyor.
- Gerçek ve biçimsel parametre uyuşmazlığı.
Öznitelik Dilbilgisi
Öznitelik dilbilgisi, bağlama duyarlı bilgiler sağlamak için bazı ek bilgilerin (özniteliklerin) bir veya daha fazla uçbirim olmayan öğelerine eklendiği bağlamdan bağımsız bir dilbilgisi biçimidir. Her öznitelik, tamsayı, kayan nokta, karakter, dize ve ifadeler gibi iyi tanımlanmış değerler alanına sahiptir.
Öznitelik dilbilgisi, bağlamdan bağımsız dilbilgisine anlambilim sağlayan bir araçtır ve bir programlama dilinin sözdizimini ve anlambilimini belirlemeye yardımcı olabilir. Öznitelik dilbilgisi (bir ayrıştırma ağacı olarak görüldüğünde) bir ağacın düğümleri arasında değerleri veya bilgileri geçirebilir.
Example:
E → E + T { E.value = E.value + T.value }
CFG'nin sağ kısmı, dilbilgisinin nasıl yorumlanması gerektiğini belirten anlamsal kuralları içerir. Burada, E ve T olmayan terminallerin değerleri toplanır ve sonuç, terminal olmayan E'ye kopyalanır.
Anlamsal nitelikler, ayrıştırma sırasında kendi alanlarından değerlerine atanabilir ve atama veya koşullar sırasında değerlendirilebilir. Özniteliklerin değerlerini alma biçimine bağlı olarak, bunlar genel olarak iki kategoriye ayrılabilir: sentezlenmiş öznitelikler ve miras alınan öznitelikler.
Sentezlenen özellikler
Bu öznitelikler, alt düğümlerinin öznitelik değerlerinden değerler alır. Örnek vermek için aşağıdaki üretimi varsayalım:
S → ABC
S, alt düğümlerinden (A, B, C) değerler alıyorsa, ABC'nin değerleri S'ye sentezlendiği için sentezlenmiş bir özellik olduğu söylenir.
Önceki örneğimizde (E → E + T) olduğu gibi, ana düğüm E, değerini alt düğümünden alır. Sentezlenen öznitelikler asla üst düğümlerinden veya kardeş düğümlerinden değer almazlar.
Devralınan özellikler
Sentezlenmiş özniteliklerin aksine, miras alınan öznitelikler ebeveynlerden ve / veya kardeşlerden değerler alabilir. Aşağıdaki üretimde olduğu gibi,
S → ABC
A, S, B ve C'den değerler alabilir. B, S, A ve C'den değerler alabilir. Aynı şekilde, C, S, A ve B'den değerler alabilir.
Expansion : Terminal olmayan bir dilbilgisi kuralına göre terminallere genişletildiğinde
Reduction: Bir uçbirim, dilbilgisi kurallarına göre karşılık gelen uçbirim olmayana indirildiğinde. Sözdizimi ağaçları yukarıdan aşağıya ve soldan sağa ayrıştırılır. İndirgeme gerçekleştiğinde, ona karşılık gelen anlamsal kuralları (eylemleri) uygularız.
Anlamsal analiz, yukarıdaki görevleri gerçekleştirmek için Sözdizimi Yönlendirmeli Çevirileri kullanır.
Anlamsal analizci, önceki aşamasından (sözdizimi analizi) AST'yi (Soyut Sözdizimi Ağacı) alır.
Anlamsal analizör, Attributed AST olarak adlandırılan AST ile nitelik bilgilerini ekler.
Öznitelikler iki demet değeridir, <öznitelik adı, öznitelik değeri>
Örneğin:
int value = 5;
<type, “integer”>
<presentvalue, “5”>
Her üretim için anlamsal bir kural koyarız.
S ile ilişkilendirilmiş SDT
Bir SDT yalnızca sentezlenmiş öznitelikler kullanıyorsa, buna S-öznitelikli SDT adı verilir. Bu öznitelikler, anlamsal eylemleri üretimden sonra yazılan S-atıflı SDT'ler kullanılarak değerlendirilir (sağ taraf).
Yukarıda tasvir edildiği gibi, S ile ilişkilendirilmiş SDT'lerdeki özellikler, ana düğümlerin değerleri alt düğümlerin değerlerine bağlı olduğundan aşağıdan yukarıya ayrıştırmada değerlendirilir.
L ile ilişkilendirilmiş SDT
Bu SDT formu, hem sentezlenmiş hem de miras alınan özellikleri, doğru kardeşlerden değer almama kısıtlamasıyla kullanır.
L-öznitelikli SDT'lerde, uçbirim olmayanlar üst, alt ve kardeş düğümlerinden değerler alabilir. Aşağıdaki üretimde olduğu gibi
S → ABC
S, A, B ve C'den (sentezlenmiş) değerler alabilir. A, yalnızca S'den değer alabilir. B, S ve A'dan değerler alabilir. C, S, A ve B'den değerler alabilir. Hiçbir uçbirimsiz, kardeşinden sağındaki değerleri alamaz.
L'ye atfedilen SDT'lerdeki özellikler, derinlik öncelikli ve soldan sağa ayrıştırma yöntemiyle değerlendirilir.
Bir tanım S'ye atfedilmişse, L'ye atfedilen tanım S'ye atfedilen tanımları içerdiğinden, aynı zamanda L'ye de atfedildiği sonucuna varabiliriz.