Bir Kod Parçasının Lexical Analizi (2)

Geçiş Tablosunun Çizilmesi

Geçiş tabloları matris yapısına benzedikleri için kodlama işlemini kolaylaştırmaktadır.

lexer6

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:

lexer7

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.

lexer8

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.

Glexer9eç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;
....

}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.