1 / 17

Derleyici Araçları FLEX & BISON

Derleyici Araçları FLEX & BISON. Edip Serdar GÜNER. Programlama Dilleri. MOVF id3, R2 MULF # 1 0.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1. sonuc = a + b * 1 0 ;. Yüksek Seviye. Düşük Seviye. Programlama Dilleri Gerçekleştirimleri. Çevirici (Translator). Yorumlayıcı

chico
Download Presentation

Derleyici Araçları FLEX & BISON

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Derleyici AraçlarıFLEX & BISON Edip Serdar GÜNER

  2. Programlama Dilleri MOVF id3, R2 MULF #10.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 sonuc = a + b * 10; Yüksek Seviye Düşük Seviye

  3. Programlama Dilleri Gerçekleştirimleri Çevirici (Translator) Yorumlayıcı (Interpreter) Derleyici (Compiler) Yorumlayıcı + Derleyici

  4. Otomatik Çeviri Paradigması Ara Dil transfer analiz üretim doğrudan çeviri Kaynak Dil Hedef Dil

  5. Derleme Adımları - 1 Kaynak Dil Kaynak Dil: sonuc = a + b * 10 Lexical Analiz Lexical Analiz: ID(1)ASSIGN ID(2)ADD ID(3)MULT INT(10) Sözdizim Analizi Anlamsal Analiz: ASSIGN ID(1) ADD ID(2) MULT ID(3) int2real INT(10) Anlamsal Analiz Sözdizim Analizi: ASSIGN ID(1) ADD ID(2) MULT ID(3) INT(10) Ara Kod Üreticisi Ara Kod Kod Optimizasyonu Hedef Dil Üreticisi Hedef Dil

  6. Derleme Adımları - 2 Kaynak Dil Ara Kod: temp1 = int2real(10) temp2 = id3 * temp1 temp3 = id2 + temp2 id1 = temp3 Optimize Edilmiş Kod: temp1 = id3 * 10.0 id1 = id2 + temp1 Lexical Analiz Hedef Dil: MOVF id3, R2 MULF #10.0, R2 MOVF id2, R1 ADDF R2, R1 MOVF R1, id1 Sözdizim Analizi Optimizasyon: Anlamsal Analiz Adım1: temp1 = 10.0 temp2 = id3 * temp1 temp3 = id2 + temp2 id1 = temp3 Ara Kod Üreticisi Ara Kod Adım2: temp2 = id3 * 10.0 temp3 = id2 + temp2 id1 = temp3 Kod Optimizasyonu Hedef Dil Üreticisi Adım3: temp2 = id3 * 10.0 id1 = id2 + temp2 Hedef Dil

  7. Lexical Analiz Tarayıcı LexemeToken sonuc IDENTIFIER = “=” a IDENTIFIER + “+” b IDENTIFIER * “*” 10 NUMBER sonuc = a + b * 10 DÜZENLİ İFADELER [ \t\n]* → boşluklar [a-z][A-zA-Z0-9]* → identifier [0-9]+ → number “+” identifier “=” identifier identifier “*” number sonuc = a + b * 10

  8. CFG (G) L(G), s’yi kabul eder ve ağacı bulur. Token dizisi (s) Hata mesajları Sözdizim Analizi Ayrıştırıcı CFG BNF (Backus-Naur Form) S = {a,b} N = {S} R = {S  aSb, S  } select_command ::= "select" [ "all" | "distinct" ] ( "*" | (displayed_column { "," displayed_column } ) ) "from" ( selected_table { "," selected_table } ) [ “where" condition ] { connect_clause } { group_clause } { set_clause } { order_clause } {update_clause }

  9. Ayrıştırma Expression → identifier Expression → number Expression → Expression "+" Expression Expression → Expression "*" Expression Expression→ "(" Expression ")“ Statement → identifier "=" Expression statement expression expression expression expression expression identifier identifier identifier number sonuc = a + b * 10

  10. Lex & Yacc / Flex & Bison • Lex / Flex, token ayrıştırma işlemini düzenli ifadeler kullanarak gerçekleştirecek C veya C++ kodunu otomatik olarak üreten bir yazılımdır. • Yacc / Bison ise Lex / Flex tarafından üretilen çıktıyı alarak sözdizimsel kurallarla ayrıştırma işlemini gerçekleştirecek kodu üreten bir yazılımdır.

  11. Flex Program Yapısı • Bütün flex programları yanyana iki % işareti kullanılarak birbirinden ayrılan 3 bölümden oluşur. • Tanım (definition) bölümü: C kodunun üstünde olması istenen tüm kod buraya yazılır. Bütün kod “%{“ ile “%}” arasında yer almalıdır. Kullanılması zorunlu değildir. • Kurallar (rules) bölümü: Burada örüntüler ve bu örüntülerle karşılaşıldığında yapılacak işlemler tanımlanır. • Kullanıcı alt-programları (user sub-routines) bölümü: Flex oluşturduğu koda bu alt-programları kopyalar.

  12. Flex Örneği %% [\t ]+ /* boşlukları atla*/; Pazartesi|Salı|Çarşamba|Perşembe|Cuma { printf("%s haftaiçibirgündür.", yytext); } Cumartesi|Pazar { printf("%s haftasonubirgündür.", yytext); } [a-zA-Z]+ { printf("%s gündeğildir.", yytext); } %% intyywrap(void) { return 1; } int main(void) { yylex(); return 0;}

  13. Flex Kullanımı • Lexical analizde kullanmak üzere bir tarayıcı üretmek için öncelikle .lex uzantılı bir yapılandırma dosyası üretmek gerekir. • Bu dosya kullanılarak flex gerekli C veya C++ kodu üretilir. flex deneme.lex • Üretilen kod derlenerek lexical analiz işlemi yapılabilir. gcc lex.yy.c –o main

  14. Bison Program Yapısı %{ C tanımlamaları (tipler, değişkenler, fonksiyonlar, önişlemci komutları) %} Bison belirtimleri (gramer sembolleri, operator öncelik tanımları, vb.) %% Gramer kuralları %% Ek C kodları

  15. Örnek (Flex) %{ #include "prog0-parser.h" %} %% [0-9]+ { return NUMBER; } [ \t] ; /*boşlukları atla*/ \n return 0; /*mantıksal EOF*/ . return yytext[0]; /*Bilinmeyen karakter*/ %%

  16. Örnek (Bison) %{ #include <iostream> using namespace std; void yyerror(char * err_string) { cerr << “Girdi eşleşmedi!" << endl; } extern int yylex(); %} %token NUMBER %% num_entry: NUMBER {cout << “Sayı buldum!" << endl;}; %% main() { yyparse(); }

  17. Bison Kullanımı • bison -d calc.y • flex lexer.l • gcc calc.tab.c lex.yy.c –o calculator

More Related