Tokenlarin Taninmasi stmt t if expr then stmt if expr then stmt else stmt expr t term relop term term term t id num if, then, else, relop, id, ve num terminal (token), stmt, expr, term nonterminal olarak adlandirilirlar. 4/5/2004 Formal Diller 2.1
Tokenlarin Taninmasi if t if then t then else t else relop t < <= = <> > >= id t letter ( letter digit ) * num t digit + (. digit + )?( E ( + - )? digit + )? letter t A B Z a b z digit t 0 1 9 4/5/2004 Formal Diller 2.2
Tokenlarin Taninmasi lexical analyzer keywords if, then, else lexemes relop, id, number lexemes white spacelerle (blanks, tab, newline) birbirlerinden ayrilirlar delim t blank tab newline ws t delim + 4/5/2004 Formal Diller 2.3
Tokenlarin RE patternleri RE ws if then else id num < <= = <> > >= Token - if then else id num relop relop relop relop relop relop Attribute-Value - - - - pointer to table entry Pointer to table entry LT LE EQ NE GT GE 4/5/2004 Formal Diller 2.4
Parser bir sonraki bir sonraki tokenu elde etmek icin lexical analyzeri cagirir. Lexical analyzer program icerisindeki tokenlari (lexema ve keywordleri) taniyip bunlarin (token, attribute-value) ciftini parsera geri dondurur. 4/5/2004 Formal Diller 2.5
Transition Diyagramlari Transition diyagramlari lexical analyzerin tokenlari bulmasi esnasinda olusan aksinlari gosterir. start > = 0 6 7 other >= icin Transition Diyagrami 8 * 4/5/2004 Formal Diller 2.6
Transition Diyagrams start < = 0 1 2 return(relop,le) = > 5 return(relop,eq) = > other 6 7 3 4 * return(relop,ne) return(relop,lt) return(relop,ge) other 8 * return(relop,gt) Relational Operatorler (relop) icin transition diyagrami 4/5/2004 Formal Diller 2.7
Identifier ve keywordlar icin transition diyagrami letter veya digit start letter other 9 10 11 * return(gettoken( ),install_id( )) 4/5/2004 Formal Diller 2.8
-Symbol Table: Lexical Analyzer tespit ettigi identifierlari, ve bunlarla ilgili bilgileri yerlestirdigi tabloya denir. -Keywordlari identifierlerden ayirmanin etkin bir yolu, baslangicta keywordlari symbol table a yerlestirmektir. Daha sonra ismi bir keywordla ayni olan identifier bulunursa lexical analyzer hata bilgisini Parsera dondurur. -gettoken( ): token i elde etmek icin Eger lexema keyword ise, keywordun kendisi geri dondurulur, aksi durumda tokenin id si geri dondurulur. -install_id( ): attribute-value yu elde etmek icin Symbol Table a bakilir. Eger bulunan lexema bir keywordse parsera 0 degeri dondurulur. Aksi takdirde lexema bulunur (program degiskeni) ve bu degisken Symbol Table a yerlestirilir ve yerlestirildigi alana ait pointer parsera geri dondurulur. 4/5/2004 Formal Diller 2.9
digit digit digit start digit. digit E +/- digit 12 13 14 15 16 17 other 18 19 * digit E digit digit start 20 digit. digit other 21 22 23 24 * digit start 25 digit 26 other 27 * num t digit + (. digit + )?( E ( + - )? digit + ) 4/5/2004 Formal Diller 2.10
delim start delim other 28 29 30 * delim t blank tab newline ws t delim + 4/5/2004 Formal Diller 2.11
Otamatik Lexical Analyzer Uretimi Gunumuzde derleyici tasariminda Lexical Analyzerlarin uretimi otomatik olarak yapilmaktadir. Zaman ve is gucu tasarrufu Derleyici tasarimini kolaylastirir Lex (Lexical Analyzer Generator) Lexical tanimlardan (RE) C programi uretir. Her bir token tipi icin, bir RE ve action tanimlanir Uretilen C programi tokenlari temsil eden Deterministic Fine Automata (DFA) simule eder ve tanidigi her token icin bu tokenun action ini yerine getirir. 4/5/2004 Formal Diller 2.12
Lex source program lex.l Lex Compiler lex.yy.c lex.yy.c C compiler a.out input a.out tokenlar dizisi 4/5/2004 Formal Diller 2.13
%{ /* C Declarations */ #include tokens.h /* definitions of IF, ID, NUM, */ #include errormsg.h union {int ival; string sval; double fval;} yyval; Int charpos=1; #define ADJ (EM_tokPos=charPos, charpos+=yyleng) %} /* Lex Definitions */ digits [0-9]+ %% 4/5/2004 Formal Diller 2.14
/* Regular Expressions and Actions */ if {ADJ; return IF;} [a-z][a-z0-9]* {ADJ; yylval.sval=string(yytext); return ID; } {digits} {ADJ; yylval.ival=atoi(yytext); return NUM; } ({digits}. [0-9]*) ([0-9]*. {digits}) {ADJ; yylval.fval=atof(yytext); return REAL; } 4/5/2004 Formal Diller 2.15
4/5/2004 Formal Diller 2.16