Yazan : Şadi Evren ŞEKER

Bilgisayar bilimlerinde programlama dillerinin tasarımı ve geliştirilmesi sırasında kullanılan ve dildeki kelimelerin analizine (lexical analysis) yarayan kod üretme programıdır. Yani lex için hazırlanmış bir dosyayı lex programından geçirdikten sonra size C dilinde bir kod çıkar. Bu kodu C dilinde derledikten (compile) sonra çalışan bir programınız olur. Veya tercihen bu çıktıyı yacc programına alt yapı oluşturmak için de kullanabilirsiniz.

LEX programının ismi inigilizcedeki lexical analyzer kelimesinden gelir. Kelime bilimi anlamına gelen Lexical kelimesinin ilk 3 harfinden kısaltılmıştır. LEX programının linux üzerinde çalışan ve yaygın bir sürümü flex ismindedir. flex programı da lex gibi çalışmaktadır ve hemen hemen aynı parametre ve özelliklerle kullanılabilir.

LEX dosyalarının 3 ana bölümü bulunur. İlk bölümde fonksiyon ve değişke tanımlamaları ve projeye dahil edilecek (include) kütüphaneler tanımlanır.

ikinci bölümde LEX dosyamızın omurgasını oluşturan düzenli deyimler ( regular expression ) kısmı yer alır. Burada her ihtimal için ayrı bir regular expression tanımlanarak ilgili regular expression’a girilmesi durumunda ne yapılacağı kodlanır.

Son bölümde ise fonksiyon içerikleri yer alır.

Aşağıda basit bir lex dosyasının içeriği verilmiştir:

%{ // yukarıda anlatılan ilk bölüm tanımlamalar yapılıyor
    #include "y.tab.h"
    #include <stdlib.h>
    void yyerror(char *);
%}

// ikinci bölüm regular expressionlar
%%

[0-9]+      {
                yylval = atoi(yytext);
                return INTEGER;
            }

[-+n]      { return *yytext; }

[ t]       ;       /* skip whitespace */

.           yyerror("Unknown character");

%%
// son bölüm fonksiyon içerikleri
int yywrap(void) {
    return 1;
}

Yukarıdaki bu dosya daha önce de anlatıldığı üzere 3 parçadan oluşmaktadır. Koddaki düzenli deyimler( regular expression) kısaca aşağıda açıklanmıştır:

  • [0-9]+ 0 ile 9 arasındaki sayılar (yani 0 1 2 3 4 5 6 7 8 9 sayılarından en az bir yada istenildiği kadar çok
  • [-+n] sembol olarak “+”, “-” veya “n” sembolleri (yani artı eksi veya satır sonu (enter tuşu))
  • [ t] sembol olara ” ” veya “t” yani boşluk karakteri (space) veya tab karakteri
  • . geri kalan bütün karakterler. LEX dosyasında üstte yazılı olan düzenli deyimlerin önceliği var ve . sembolü herşeyi kapsar dolayısıyla yukarıdakilerden birisine girmezse buraya girer.

Yukarıdaki düzenli deyimler için yapılan işlemler küme parantezleri arasında (curved brackets) yazılmaktadır. Bu alanlarda yazılanları da tanıyalım:

yylval değişkeni lex tarafından döndürülen değerdir. Bu değer dahil edilen y.tab.h dosyasında tanımlanır ve bu değişkene değer atanarak lex’den örneğin yacc’a veri geçişi sağlanır.

yytext değişkeni ilgili düzenli deyime (Regular expression) giren terimleri alır. Örneğin lex çalışırken 123 gibi bir girdi aldı diyelim. Bu girdi ilk düzenli deyime girecek (çünkü 123 sayısal değerleri [0-9] aralığına uyan 3 sembolden oluşuyor ve bu sembollerin 3 kere tekrarlanması bu düzenli deyim tarafından algılanır). Bu deyim girdikten sonra yapılan iş gelen metin değerini (yytext ki burada “123” dizgisi (String) oluyor) atoi fonksiyonu ile integer tipine çevirir. Bu çevrilen değer yylval değişkenine atanarak yacc’a geçirilmektedir.

Yorumlar

  1. Hüseyin Varol Erdem

    Güzel paylaşımlarınız için çok teşekkürler!! Hiç bir yerde böyle güzel ve sade bir anlatım bulamıyorum.

Bir cevap yazın

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