Geçiş Tablosunun Çizilmesi
Geçiş tabloları matris yapısına benzedikleri için kodlama işlemini kolaylaştırmaktadır.
Yukarıdaki örnek için bir geçiş tablosu oluşturulmak istenirse:
i | n | t | bosluk | other | |
q0 | q1 | – | – | – | – |
q1 | – | q2 | – | – | – |
q2 | – | – | q4 | – | – |
q3 | – | – | – | – | q0 |
q4 | – | – | – | q3 |
Şeklinde oluşturulabilir. Burada q0 satırındayken i geçiş sembolünün gelmesi q1 durumuna getirdiği ve diğer başka durumlarda değişiklik olmadığı rahatlıkla görülmektedir.
Yukarıdaki örneğe benzer şekilde önceki ders hazırladığımız otomat için durum geçiş tablosu aşağıdaki gibi çizilebilir:
Tabloda durum ve geçişler görülmektedir. Sarı renkle belirtilenler son durumlardır. Bir durumun son durum olması lexical analiz sonucunda tanınacağı manasına gelmektedir. Ayrıca tab ve space gibi boşluklarda otomat başa döndürülmektedir.
Tablodan yola çıkılarak while’ı analiz edelim. Başlangıç durumu q9’dur. Bu durumdayken w sembolü geldiği zaman durum q1’e değişmektedir. Durum, q1’deyken h sembolü okunduğu zaman q2’ye, i sembolü okuduğu zaman q4’e, q4’teyken l sembolü okunduğu zaman q6’ya, en sonunda da q6’dayken e sembolü okunduğu zaman q12’ye değişmektedir. q12 ise son durumdur ve aşağıda da görüldüğü üzere while’ı ifade etmektedir.
Temel Algoritma
Çok fazla anahtar kelime de tanıtılmaya çalışılsa, örnekte olduğu gibi az anahtar kelime de tanıtılmaya çalışılsa temel algoritma değişmeyecektir. Bir başlangıç durumu belirlenecek ve durum değişkenine bu durum atanacaktır. Dana sonra alınan ilk karakterin başlangıç durumundan hangi duruma değiştirileceğine döngü içinde bakılacak ve döngü sonunda final durumu ortaya çıkarsa token tanınacaktır.
Geçiş tablosu oluştuktan sonra ikili matris şeklinde kullanılabilir. Bu şekilde geçiş tablosu koda dökülmüş olur. Kabul tablosu ise durumların sırasına göre kabul edilen veya edilmeyen durumların sıralandığı tablodur. Kabul tablosunda sarı ile gösterilen durumlar son durumdur ve kabul edilebilir.
String kabul_tablosu[?]={}; char *c; durum = baslangıc_durumu; c = tum_text.toChar(); for (i=0 ; i < c.size();i++) { durum = durum_degistir(durum , c[i]); Stringdurum.tipi=kabul_tablosu[durum]; switch(durum) { caseTOKEN_WHILE: print durum.degeri; print durum.tipi; durum = baslangıc_durumu; break; caseTOKEN_IF: print durum.degeri; print durum.tipi; durum = baslangıc_durumu; break; ....
}