Compiler Tools Presentation (Flex & Bison)
Download
Report
Transcript Compiler Tools Presentation (Flex & Bison)
Derleyici Araçları
FLEX & BISON
Edip Serdar GÜNER
Programlama Dilleri
sonuc = a + b * 10;
Yüksek Seviye
MOVF
MULF
MOVF
ADDF
MOVF
id3, R2
#10.0, R2
id2, R1
R2, R1
R1, id1
Düşük Seviye
Programlama Dilleri
Gerçekleştirimleri
Çevirici
(Translator)
Yorumlayıcı
(Interpreter)
Derleyici
(Compiler)
Yorumlayıcı
+
Derleyici
Otomatik Çeviri Paradigması
Ara Dil
transfer
doğrudan çeviri
Kaynak
Dil
Hedef
Dil
Derleme Adımları - 1
Kaynak Dil
Lexical Analiz
Sözdizim Analizi
Anlamsal Analiz
Kaynak Dil:
sonuc = a + b * 10
Lexical Analiz:
ID(1) ASSIGN ID(2) ADD ID(3) MULT INT(10)
Sözdizim Analizi:
ASSIGN
Anlamsal Analiz:
ASSIGN
ID(1)
ID(1)
Ara Kod Üreticisi
Ara Kod
ADD
ID(2)
MULT
ID(3)
Kod Optimizasyonu
Hedef Dil Üreticisi
Hedef Dil
INT(10)
ADD
ID(2)
MULT
ID(3)
int2real
INT(10)
Derleme Adımları - 2
Kaynak Dil
Lexical Analiz
Sözdizim Analizi
Anlamsal Analiz
Ara Kod Üreticisi
Ara Kod
Kod Optimizasyonu
Hedef Dil Üreticisi
Hedef Dil
Ara Kod:
temp1 = int2real(10)
temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
Optimizasyon:
Adım 1:
temp1 = 10.0
temp2 = id3 * temp1
temp3 = id2 + temp2
id1 = temp3
Adım 2:
temp2 = id3 * 10.0
temp3 = id2 + temp2
id1 = temp3
Adım 3:
temp2 = id3 * 10.0
id1 = id2 + temp2
Optimize Edilmiş Kod:
temp1 = id3 * 10.0
id1 = id2 + temp1
Hedef Dil:
MOVF id3, R2
MULF #10.0, R2
MOVF id2, R1
ADDF R2, R1
MOVF R1, id1
Lexical Analiz
sonuc = a + b * 10
Tarayıcı
DÜZENLİ İFADELER
[ \t\n]*
[a-z][A-zA-Z0-9]*
[0-9]+
→ boşluklar
→ identifier
→ number
Lexeme
Token
sonuc
=
a
+
b
*
10
IDENTIFIER
“=”
IDENTIFIER
“+”
IDENTIFIER
“*”
NUMBER
identifier
“=”
identifier
“+”
identifier
“*”
number
sonuc
=
a
+
b
*
10
Sözdizim Analizi
CFG (G)
Ayrıştırıcı
Token dizisi (s)
L(G), s’yi kabul eder
ve ağacı bulur.
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 }
Ayrıştırma
Expression → identifier
Expression → number
Expression → Expression "+" Expression
Expression → Expression "*" Expression
Expression → "(" Expression ")“
Statement → identifier "=" Expression
statement
expression
expression
identifier
sonuc
=
expression
expression
expression
identifier
identifier
number
a
+
b
*
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.
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.
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; }
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
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ı
Örnek (Flex)
%{
#include "prog0-parser.h"
%}
%%
[0-9]+
[ \t]
\n
.
%%
{ return NUMBER; }
;
/*boşlukları atla*/
return 0;
/*mantıksal EOF*/
return yytext[0]; /*Bilinmeyen karakter*/
Ö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(); }
Bison Kullanımı
• bison -d calc.y
• flex lexer.l
• gcc calc.tab.c lex.yy.c –o calculator