Sunuyu indir
1
Derleyici Araçları FLEX & BISON
Edip Serdar GÜNER
2
Programlama Dilleri sonuc = a + b * 10; MOVF id3, R2 MULF #10.0, R2
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 Lexical Analiz Sözdizim Analizi
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 Lexical Analiz Sözdizim Analizi
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ım 1: temp1 = 10.0 temp2 = id3 * temp1 temp3 = id2 + temp2 id1 = temp3 Ara Kod Üreticisi Ara Kod Adım 2: temp2 = id3 * 10.0 temp3 = id2 + temp2 id1 = temp3 Kod Optimizasyonu Hedef Dil Üreticisi Adım 3: temp2 = id3 * 10.0 id1 = id2 + temp2 Hedef Dil
7
Lexical Analiz Lexeme Token Tarayıcı 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
Sözdizim Analizi CFG (G) Ayrıştırıcı L(G), s’yi kabul eder
ve ağacı bulur. Token dizisi (s) Hata mesajları 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 statement expression expression expression expression
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 hafta içi bir gündür.", yytext); } Cumartesi|Pazar { printf("%s haftasonu bir gündür.", yytext); } [a-zA-Z]+ { printf("%s gün değildir.", yytext); } int yywrap(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
Benzer bir sunumlar
© 2024 SlidePlayer.biz.tr Inc.
All rights reserved.