• Bağış
  • YACC

    Yazan : Şadi Evren ŞEKER

    YACC, bilgisayara bilimlerinin önemli dallarından birisi olan dil tasarımı ve dil geliştirilmesi sırasında (compiler teory) sıkça kullanılan bir kod üretici programdır. YACC basitçe dildeki sözdizim (syntax) tasarımı için kullanılır ve tasarladığımız dildeki kelimelerin sıralamasının istediğimiz şekilde girilip girilmediğini kontrol eder. Aynı zamanda sıralamadaki her kelimenin anlamını da yacc marifetiyle belirleyebiliriz.

    YACC temel olarak BNF (Backus Normal Form) kullanarak cümle dizimini belirtmektedir.

    LEX ile birlikte kullanıldığıdan bir dil tasarımının neredeyse yarısı olan lexical (kelime) ve syntax (cümle) analizi tamamlanmış olur. Bundan sonra dildeki her kelime ve cümle diziliminin anlamını (semantic) kodlamak kalır.

    YACC neredeyse tamamen aynı olan açık kaynak kodlu bison isimli paket ile de kurulabilir.

    Aşağıda örnek bir yacc dosyası verilmiştir. Bu dosyayı inceleyerek yacc’ın kullanımını anlamaya çalışalım:

    %{ // tanımlamam yapılan ilk bölüm
        #include <stdio.h>
        int yylex(void);
        void yyerror(char *);
    %}
    
    %token INTEGER
    
    %% // BNF yapısındaki ikinci bölüm
    
    program:
            program expr '\n'         { printf("%d\n", $2); }
            |
            ;
    
    expr:
            INTEGER
            | expr '+' expr           { $$ = $1 + $3; }
            | expr '-' expr           { $$ = $1 - $3; }
            ;
    
    %%
    // fonksiyon içeriklerinin bulunduğu son bölüm
    void yyerror(char *s) {
        fprintf(stderr, "%s\n", s);
    }
    
    int main(void) {
        yyparse();
        return 0;
    }

    Dosyamız LEX’e benzer şekilde 3 bölümden oluşmaktadır. İlk bölümde kodumuza dahil edilecek kütüphaneleri ve fonksiyon prototiplerini tanımlıyoruz.

    ikinci bölümde BNF yapısı benzeri bir şekilde dilimizdeki sözdizim tanımlanıyor.

    üçüncü ve son bölümde fonksiyon tanımları ve main fonksiyonu bulunmaktadır.

    Yukarıdaki dosyada yapılan işlemleri aşağıda anlatalım:

    YACC dosyasında %token ve %type olarak iki farklı tanım yapılabilmektedir. %token tanımı lex’den gelen bir sabit bilgiyi taşımak için kullanılır. %type ise yacc içerisinde tanımlanan devamlıları (nonterminal) ifade etmek için kullanılır.

    Genelde bir kural olmamasına karşılık BNF yapısındaki sonlular (terminal) büyük harfle ve devamlılar (nonterminal) küçük harf ile yazılırlar. (dosyamızın C kodu üreteceğini ve gerek yacc gerek lex gerek se C dilinin büyükküçük harfe duyarlı (case sensitive) olduğunu unutmayınız)

    yyerror fonksiyonu yacc tarafından girilen değeri kontrol ederken bir dizilim hatası bulunması (syntax error) çağrılan fonksiyondur.

    main fonksiyonu aynen üretilen koda kopyalanmakta ve ilk çalışan C fonksiyonumuzdur.

    BNF yapısının yanında bulunan ve küme parantezleri arasında (curved brackets) bulunan kodda ise aşağıdaki terimler kullanılabilir:

    $$ -> bu devamlıdan (nonterminal) dönecek olan değerdir.

    $1 -> BNF yapımızdaki ilk parametredir. Örneğin aşağıdaki satırı ele alalım:

     | expr '+' expr           { $$ = $1 + $3; }

    Bu satırda ilk sembol veya anlamında | sembolüdür. Bu sembolün amacı bir expr tanımlanırken ihtimallerden birisi olmasıdır. Ardından expr sembolü ilk sembol ‘+’ ikinci sembol ve ikinci expr sembolü ise 3. semboldür. Dolayısıyla sırasıyla :

    $1= expr

    $2= ‘+’

    $3 = expr

    anlamına gelmektedir.

    Bu satırın bulunması durumunda yapılacak işlem ilk expr karşılık gelen değer ile ikinci expr karşılık gelen değerin sayısal olarak toplanması ve sonuç olarak $$ marifeti ile döndürülmesidir.

    Benzer Yazılar:

    Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'YACC' isimli yazı 12 Dec 2008 tarihinde, saat: 20:46 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 1086 defa okunmuştur.

    Benzer yazıları Automata (otomatlar, özdevinirler), Programlama Dilleri, Sistem Programlama (System Programming) kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


    Category: Automata (otomatlar, özdevinirler), Programlama Dilleri, Sistem Programlama (System Programming)
    1 response to “YACC”
    1. b_iZec says:

      süper bi paylaşımm.. paylaşımların hepsi harikaa!! !!! süper çok saolunn!! benje herkese yararlı olujak bilgiler bunlarr!!! bence yorum yazmadan geçmemek gerekiRR: süpeR!!!

    Leave a Reply