Derleyici AralarFLEX & BISONEdip Serdar GNER
Programlama Dillerisonuc = a + b * 10;MOVF id3, R2MULF #10.0, R2MOVF id2, R1ADDF R2, R1MOVF R1, id1Yksek SeviyeDk Seviye
Programlama Dilleri Gerekletirimlerievirici(Translator)Yorumlayc(Interpreter)Derleyici(Compiler)Yorumlayc+Derleyici
Otomatik eviri ParadigmasanalizretimKaynak DilHedef DilAra Diltransferdorudan eviri
Derleme Admlar - 1Kaynak Dil:sonuc = a + b * 10Lexical Analiz:ID(1) ASSIGN ID(2) ADD ID(3) MULT INT(10)Szdizim Analizi: ASSIGN
ID(1) ADD
ID(2) MULT
ID(3) INT(10)
Anlamsal Analiz: ASSIGN
ID(1) ADD
ID(2) MULT
ID(3) int2real
INT(10)
Hedef DilAnlamsal Analiz Szdizim AnaliziLexical AnalizKod OptimizasyonuHedef Dil reticisiAra Kod reticisiAra KodKaynak Dil
Derleme Admlar - 2Hedef DilAnlamsal Analiz Szdizim AnaliziLexical AnalizKod OptimizasyonuHedef Dil reticisiAra Kod reticisiAra KodKaynak DilAdm 1:temp1 = 10.0temp2 = id3 * temp1temp3 = id2 + temp2id1 = temp3Adm 2:temp2 = id3 * 10.0temp3 = id2 + temp2id1 = temp3Adm 3:temp2 = id3 * 10.0id1 = id2 + temp2Optimize Edilmi Kod:temp1 = id3 * 10.0id1 = id2 + temp1Hedef Dil:MOVF id3, R2MULF #10.0, R2MOVF id2, R1ADDF R2, R1MOVF R1, id1Ara Kod:temp1 = int2real(10)temp2 = id3 * temp1temp3 = id2 + temp2id1 = temp3Optimizasyon:
Lexical Analizsonuc = a + b * 10 LexemeToken sonucIDENTIFIER == aIDENTIFIER ++ bIDENTIFIER ** 10NUMBERTarayc[ \t\n]* boluklar[a-z][A-zA-Z0-9]* identifier [0-9]+ numberidentifieridentifieridentifiernumbersonuc=a+b*10=+*DZENL FADELER
Szdizim AnaliziAyrtrcS = {a,b} N = {S} R = {S aSb, S }CFGselect_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 } BNF (Backus-Naur Form)
AyrtrmaExpression identifier Expression numberExpression Expression "+" ExpressionExpression Expression "*" Expression Expression "(" Expression ")Statement identifier "=" Expressionstatementexpressionidentifieridentifieridentifiernumberexpressionexpressionexpressionexpressionsonuc=a+b*10
Lex & Yacc / Flex & BisonLex / Flex, token ayrtrma ilemini dzenli ifadeler kullanarak gerekletirecek C veya C++ kodunu otomatik olarak reten bir yazlmdr.Yacc / Bison ise Lex / Flex tarafndan retilen kty alarak szdizimsel kurallarla ayrtrma ilemini gerekletirecek kodu reten bir yazlmdr.
Flex Program YapsBtn flex programlar yanyana iki % iareti kullanlarak birbirinden ayrlan 3 blmden oluur.Tanm (definition) blm: C kodunun stnde olmas istenen tm kod buraya yazlr. Btn kod %{ ile %} arasnda yer almaldr. Kullanlmas zorunlu deildir.Kurallar (rules) blm: Burada rntler ve bu rntlerle karlaldnda yaplacak ilemler tanmlanr.Kullanc alt-programlar (user sub-routines) blm: Flex oluturduu koda bu alt-programlar kopyalar.
Flex rnei%%
[\t ]+/* boluklar atla*/;
Pazartesi|Sal|aramba|Perembe|Cuma { printf("%s hafta ii bir gndr.", yytext); }
Cumartesi|Pazar { printf("%s haftasonu bir gndr.", yytext); }
[a-zA-Z]+ { printf("%s gn deildir.", yytext); }
%%
int yywrap(void) { return 1; }
int main(void) { yylex(); return 0; }
Flex KullanmLexical analizde kullanmak zere bir tarayc retmek iin ncelikle .lex uzantl bir yaplandrma dosyas retmek gerekir.Bu dosya kullanlarak flex gerekli C veya C++ kodu retilir. flex deneme.lexretilen kod derlenerek lexical analiz ilemi yaplabilir. gcc lex.yy.c o main
Bison Program Yaps%{ C tanmlamalar (tipler, deikenler, fonksiyonlar, nilemci komutlar)%}Bison belirtimleri (gramer sembolleri, operator ncelik tanmlar, vb.)%%Gramer kurallar%%Ek C kodlar
rnek (Flex)%{#include "prog0-parser.h"%}
%%
[0-9]+ { return NUMBER; }[ \t] ; /*boluklar atla*/\n return 0; /*mantksal EOF*/. return yytext[0]; /*Bilinmeyen karakter*/
%%
Bison Kullanmbison -d calc.y flex lexer.l gcc calc.tab.c lex.yy.c o calculator