Transcript
  • 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*/

    %%

  • rnek (Bison)%{#include using namespace std;void yyerror(char * err_string) { cerr
  • Bison Kullanmbison -d calc.y flex lexer.l gcc calc.tab.c lex.yy.c o calculator