Ortam-Bağımsız Gramerler (OBG) Formalizm Türemeler Backus-Naur Şekli Soldan ve Sağdan Türemeler
‘Gevşek’ Yorumlar Ortam-bağımsız gramer dilleri tanımlamak için bir notasyondur. Sonlu özdevinirlerden daha güçlüdür, ama yine de tüm dilleri tanımlayamaz. İçiçie geçmiş yapılar için faydalıdır. Ör: programlama dillerindeki parantezler.
‘Gevşek’ Yorumlar – (2) Temel fikir, dizi kümelerini (yani dilleri) temsil eden “değişkenler” kullanmak. Bu değişkenler özyinelemeli olarak birbirleri cinsinden tanımlanırlar (genellikle). Özyinelemeli kurallarda (“üretimler”) sadece bitiştirme vardır. Bir değişken için alternatif kurallar birleşime de izin verir.
Örnek: { 0n1n | n > 1} için OBG Kurallar: S -> 01 S -> 0S1 Temel: 01 dilin içindedir. Tümevarım: w dilin içinde ise, 0w1 de dilin içindedir.
OBG Bileşenleri Terminaller = tanımlanan dilin alfabesinde olan semboller. Değişkenler = terminal-olmayanlar = her biri bir dili temsil eden sonlu sayıda semboller kümesi. Başlangıç Sembolü = dili tanımlamakta olduğumuz dil olan değişken.
Üretimler (kurallar) Üretim değişken -> değişkenler ve terminaller dizisi şeklindedir. Gelenek: A, B, C,… değişkenler. a, b, c,… terminaller. …, X, Y, Z terminal veya değişken. …, w, x, y, z sadece terminallerden oluşan diziler. , , ,… terminallerden ve/veya değişkenlerden oluşan diziler.
Örnek: Resmi (Formel) OBG { 0n1n | n > 1} için formel bir OBG. Terminaller = {0, 1}. Değişkenler = {S}. Başlangıç Sembolü= S. Kurallar = S -> 01 S -> 0S1
Türemeler – İçgüdü Bir OBG’in dizilerini başlangıç sembolü ile başlayıp, tekrar tekrar değişkenleri kurallarının sağ tarafları ile değiştirierek türetiriz. “A’nın kuralları” -> işaretinin solunda A olan kurallardır.
Türemeler – Şeklen A -> bir kural ise, A => deriz. Örnek: S -> 01; S -> 0S1. S => 0S1 => 00S11 => 000111.
Tekrarlayan Türeme =>* “sıfır veya daha fazla türeme adımı” demektir. Temel: herhangi bir dizisi için, =>* . Tümevarım: =>* ve => ise, o zaman =>* .
Örnek: Tekrarlamalı Türeme S -> 01; S -> 0S1. S => 0S1 => 00S11 => 000111. So S =>* S; S =>* 0S1; S =>* 00S11; S =>* 000111.
Cümlesel Şekiller (Sentential Forms) Başlangıç sembolünden türeyen herhangi bir değişken ve/veya terminal dizisine cümlesel şekil denir. Resmi olarak, bir cümlesel şekildir ancak ve ancak S =>* .
Bir Gramerin Dili G bir OBG ise, G’nin dili L(G) = {w | S =>* w}. Not: w bir terminal dizisi olmalı, S de başlangıç sembolü. Örnek: G’nin kuralları şöyle olsun. S -> ε and S -> 0S1. L(G) = {0n1n | n > 0}. Not: ε sağ tarafta kullanılabilir.
Ortam-Bağımsız Diller Bir OBG tarafından tanımlanan bir dile ortam-bağımsız dil (OBD) denir. Düzenli olmayan OBD’ler vardır (mesala, bir önceki örnekte verilen dil). Ancak OBD olmayan diller de vardır. İç güdüsel olarak: OBD’ler sadece iki şeyi sayabilir, üç değil.
BNF Gösterimi Programlama dilleri için gramerler çoğunlukla BNF (Backus-Naur Form ) göserimi ile yazılırlar Değişkenler, <…> içinde sözcüklerdir; Örnek: <statement>. Terminaller çoğunlukla kalın yazılmış, veya altı çizilmiş çok karakterli dizlerdir; Örnek: while veya WHILE.
BNF Gösterimi – (2) -> yerine ::= kullanılır. | sembolü “veya” anlamında kullanılır. Sol tarafı ayni olan kurallar için kısa yol. Örnek: S -> 0S1 | 01 S -> 0S1 ve S -> 01 için kısa yoldur.
BNF Gösterimi – Kleene Kapatması … sembolü “bir veya daha çok” anlamında kullanılır. Örnek: <digit> ::= 0|1|2|3|4|5|6|7|8|9 <unsigned integer> ::= <digit>… Not: DD’lerin *’ı ile tam ayni şey değil. Anlamı: ’yı … yeni bir değişken A ve A -> A | kuralları ile değiştirin.
Örnek: Kleene Kapatması Unsigned integers (işaretsiz tamsayılar) grameri aşağıdaki ile değiştirilebilir: U -> UD | D D -> 0|1|2|3|4|5|6|7|8|9
BNF Gösterimi: Seçmeli Elemanlar Onları seçmeli hale getirmek için, bir veya daha çok sembolü […] ile çevreleyin. Örnek: <statement> ::= if <condition> then <statement> [; else <statement>] Anlamı: [] terimini yeni bir değişken A ve A -> | ε kuralları ile değiştirin.
Örnek: Seçmeli Elemanlar if-then-else grameri aşağıdaki ile değiştirilebilir: S -> iCtSA A -> ;eS | ε
BNF Gözterimi – Gruplama Bir ünite olarak işlem görmesi gereken sembol dizilerini {…} ile çevreleyin. Tipik olarak, onlardan sonra … kullanılır ( “bir veya daha çok”) Örnek: <statement list> ::= <statement> [{;<statement>}…]
Anlamı: Gruplama Dilerseniz, {} için yeni bir A değişkeni ve A -> kuralı yaratabilirsiniz. {} yerine A kullanın.
Örnek: Gruplama L -> S [{;S}…] L -> S [A…] A -> ;S ile değiştirin. A stands for {;S}. Sonra L -> SB B -> A… | ε A -> ;S ile değiştirin B, [A…]’nın yerini tutar (sıfır veya daha çok A). Son olarak L -> SB B -> C | ε C -> AC | A A -> ;S ile değiştirin C, A…’nın yerini tutar .
Soldan ve Sağdan Türemeler Türemeler, dizi içindeki herhangi bir değişkeni kuralının sağı ile değiştirmemize izin verir. Netice olarak bir dizinin birçok türemesi olabilir. En soldaki (veya sağdaki) değişkenin seçilmesini zorunlu kılarak, bu “önemsiz farklılıkları” önlemiş oluruz.
Soldan Türemeler w bir terminaller dizisi ise ve A -> bir kural ise, o zaman wA =>lm w olarak yazarız. Ayni zamanda, 0 veya daha çok =>lm adımında olursa, o zaman =>*lm olarak yazarız. (lm = leftmost = soldan)
Örnek: Soldan Türeme Dengeli-parantezler grameri: S -> SS | (S) | () S =>lm SS =>lm (S)S =>lm (())S =>lm (())() Böylece, S =>*lm (())() S => SS => S() => (S)() => (())() bir türemedir, ama soldan değil.
Sağdan Türeme w bir terminaller dizisi ise ve A -> bir kural ise, o zaman Aw =>rm w olarak yazarız. Ayni zamanda, 0 veya daha çok =>rm adımında olursa, o zaman =>*rm olarak yazarız. (rm = rightmost = sağdan)
Örnek: Sağdan Türeme Dengeli-parantezler grameri: S -> SS | (S) | () S =>rm SS =>rm S() =>rm (S)() =>rm (())() Böylece, S =>*rm (())() S => SS => SSS => S()S => ()()S => ()()() ne soldan, ne de sağdan bir türemedir.