Presentasi sedang didownload. Silahkan tunggu

Presentasi sedang didownload. Silahkan tunggu

1 Pertemuan 2 Lexical Analyzer Matakuliah: T0522 / Teknik Kompilasi Tahun: 2005 Versi: 1/6.

Presentasi serupa


Presentasi berjudul: "1 Pertemuan 2 Lexical Analyzer Matakuliah: T0522 / Teknik Kompilasi Tahun: 2005 Versi: 1/6."— Transcript presentasi:

1 1 Pertemuan 2 Lexical Analyzer Matakuliah: T0522 / Teknik Kompilasi Tahun: 2005 Versi: 1/6

2 2 Learning Outcomes Pada akhir pertemuan ini, diharapkan mahasiswa akan mampu : Mahasiswa dapat menjelaskan lexical analysis dan peranannya dalam teknik kompilasi (C2) Mahasiswa dapat menjelaskan pengertian token, attribute, dan lexeme dan penggunaan regular expression (RE) dalam lexical analysis (C2) Mahasiswa dapat mendemonstrasikan pengenalan token dengan menggunakan transisi diagram dan RE (C3)

3 3 Outline Materi Peranan Lexical Analysis Input buffering Symbol table Regular Expression Regular Definition Pengenalan token, attribute dan lexeme Diagram Transisi Finite Automata Konversi dari RE ke NFA Konversi dari RE ke DFA Minimisasi DFA

4 4 Peranan Lexical Analyzer (Scanner) Membaca Source program (input characters) & menghasilkan output berupa rangkaian token. Scanner biasanya diimplementasikan dalam bentuk subroutine dari program Parser. Hal lain yang juga biasa dilakukan oleh scanner : –Membuang comment &white space (blank, tab, dan newline character). –Menghasilkan error messages. Lexical Analyzer Parser Symbol Table Source Program Token Get Token

5 5 Beberapa Isu pada Lexical Analysis Alasan mengapa Lexical Analysis dipisahkan dari Syntax Analysis : –Desain kompiler menjadi lebih sederhana –Efisiensi kompiler meningkat –Portabilitas kompiler meningkat Token, Pattern dan Lexeme –Token: bagian terkecil dari suatu bahasa program yang mempunyai suatu arti/fungsi. –Lexeme: Rangkaian karakter pada source program yang sama (“matched”) dengan pola (“pattern”) suatu token. –Pattern: Suatu pola/ rule/ aturan yang menggambarkan struktur suatu token.

6 6 Contoh Token, Lexeme dan Pattern TokenContoh LexemeContoh Pattern const_symconstconst if_symifif relation,>,>= atau > atau >= idpi, count, d2Letter diikuti oleh letters atau digits num3.14, 0, 6.0E10Sembarang konstanta angka literal“Hallo”Sembarang karakter “diantara“ dan “kecuali “ Token selalu merupakan “terminal symbol” pada grammar suatu bahasa Umumnya pada bahasa pemrograman bentuk-bentuk berikut diperlakukan sebagai token : keyword, operator, identifier, konstanta, string literal, simbol-simbol pungtuasi.

7 7 Atribut-atribut Token Informasi tentang token Menentukan pada saat penerjemahan token Disimpan dalam symbol table Pada prakteknya, token mempunyai single attribute, berupa pointer ke lokasi (entry) pada symbol table dimana informasi lain tentang token disimpan. Biasa dituliskan sebagai : Contoh: E := M * C + 2 –Token - tokennya akan dihasilkan sbb:

8 8 Input Buffering Fungsi : menyimpan hasil scanning untuk menemukan token Untuk menemukan 2 token digunakan 2 pointer : –Pointer forward: menunjuk akhir token –Pointer lexeme_beginning: menunjuk awal token Buffer hanya menampung satu baris perintah E = M * C * * 2 eof forward lexeme-beginning

9 9 Lexical Error Handling Hanya sedikit kesalahan yang dapat dideteksi pada tahap lexical analysis Jenis kesalahan yang dapat dideteksi, yaitu bila scanner menemukan invalid character yang bukan merupakan bagian atau menyalahi pattern suatu token. Strategi Error-Recovery : –Paling sederhana: “Panic mode”, yaitu menghapus karakter tersebut dan karakter – karakter berikut hingga ditemukan suatu token. –Menghapus sebuah karakter ekstra. –Menyisipkan sebuah karakter yang hilang. –Mengganti sebuah karakter yang salah dengan sebuah karakter yang benar. –Menukarkan dua karakter yang berdampingan.

10 10 Symbol Table Symbol table adalah suatu struktur data yang digunakan untuk menyimpan informasi tentang komponen (token) suatu source program. Informasi yang dimaksud : –Lexeme –Type of identifier –Kegunaan identifier (procedure,variable,label) Informasi dikumpulkan saat tahap analysis, dan akan digunakan pada saat tahap synthesis.

11 11 Symbol Table Interface Dua operasi utama : –insert (s,t) : menghasilkan indeks lokasi dimana string s disimpan, token t. –lookup (s) : menghasilkan indeks lokasi dimana s berada, atau 0 bila s tak ditemukan. Penanganan Reserved Keywords –Biasanya reserved keywords disimpan di symbol table pada saat awal operasi kompiler  Symbol table diinitialisasi Contoh : insert (“begin”, begin_sym) insert (“end”, end_sym) Sehingga bila dilakukan lookup(“begin”)  akan menghasilkan token begin_sym.  begin tidak bisa digunakan sebagai identifier.

12 12 String dan Languages Alphabet atau character class adalah suatu himpunan terbatas dari simbol-simbol. –Contoh simbol: huruf-huruf dan karakter-karakter –Himpunan {0,1} adalah binary alphabet String adalah rangkaian terbatas simbol-simbol yang terbentuk dari alphabet –Panjang suatu string s, biasa dituliskan |s|, adalah banyaknya simbol dalam string s –Contoh : Alphabet A = {a,b,c} string2 : a, abc |a| = 1 b, abca |abc| = 3 c, bc |  | = 0 Empty string  

13 13 Istilah-istilah bagian dari suatu string prefix proper prefix suffix proper suffix substring proper substring subsequence Contoh : Bila s = abc, maka: prefix s : , a, ab, abc proper prefix s: a, ab suffix s : abc, bc, c,  proper suffix s : bc, c substring s : prefix s  suffix s  b : , a, ab, abc, bc, c, b proper substring s: substring s- abc -  subsequence s : substring s  ac

14 14 Operasi pada String Bila x dan y adalah string, maka concatenation x dan y, dituliskan xy adalah gabungan antara string x dan y (string y ditambahkan ke string x) Contoh : bila x = dog, y = house, maka xy = doghouse, yx = housedog  = concatenation identity  x = x  = x Eksponensiasi string : s 0 =  s 1 = suntuk i > 0, maka s 2 = sss i = s i-1 s s 3 = sss Contoh s 3 = s 2 s = sss Language adalah suatu himpunan string-string yang berasal dari suatu alphabet tertentu.

15 15 Beberapa operasi terhadap language Union (  ) Concatenation Closure :- Kleene Closure (*) - Positive Closure (+) Bila L dan M adalah Language, maka: –L  M = { s | s is in L or s is in M } –LM= { st | s is in L and t is in M } –L*= L i –L+= L i

16 16 Regular Expression (RE) RE adalah suatu notasi yang bisa digunakan untuk mendefinisikan suatu himpunan (set) secara tepat. RE pada teknik kompilasi digunakan untuk mendefinisikan token-token dari suatu language Contoh : Token identifier pada Pascal, bisa ditulis sebagai : letter ( letter | digit )* dimana : | berarti “atau” ( ) digunakan untuk mengelompokkan subexpression * berarti “nol atau lebih” Suatu RE dapat terdiri dari beberapa RE yang lebih sederhana sesuai dengan aturan RE yang telah didefinisikan sebelumnya.

17 17 Beberapa aturan definisi RE  adalah regular expression, yang mendefinisikan {  } Bila a adalah simbol pada alphabet , maka a adalah RE yang menyatakan {a} Bila r dan s adalah RE untuk language L(r) dan L(s) maka : 1.(r)|(s) adalah RE untuk L(r)  L(s) 2.(r)(s) adalah RE untuk L(r)L(s) 3.(r)* adalah RE untuk (L(r))* 4.(r) 2 adalah RE untuk L(r) 2 –Language yang didefinisikan oleh suatu RE disebut “regular set” (Himpunan regular)

18 18 Contoh RE Untuk alphabet  = {a, b} 1.RE a | b menyatakan himpunan {a,b} 2.RE (a | b)(a | b) menyatakan {aa,ab,ba,bb} 3.RE a* menyatakan { ,a,aa,aaa,...} 4.RE a+ menyatakan {a,aa,aaa,...} 5.RE (a | b)* menyatakan himpunan semua string yang terdiri dari nol atau lebih a atau b. 6.RE a|a*b menyatakan himpunan yang berisi semua string yang terdiri dari nol atau lebih a, diikuti oleh sebuah b. –Bila dua buah RE r dan s menyatakan language yang sama, maka r dan s disebut equivalent, dituliskan r = s Contoh : (a | b) = (b | a)

19 19 Regular Definition (RD) RD adalah suatu sekuens/rangkaian definisi dalam bentuk : d 1  r 1 dimana : d 2  r 2 d i nama yang unik r i adalah RE yang terdiri dari simbol- …….. simbol dalam  {d 1,d 2,...d I-1 } d n  r n Contoh : regular definition untuk identifier pada Pascal : –letter  A|B|...|Z||a|b|...|z –digit  0|1|...|9 –id  letter(leter|digit)* RD untuk unsigned numbers: –digit  0|1|...|9 –digits  digit digit* –Optional_fraction . digits |  –optional_exponent  ( E (+|-|  ) digits ) |  –num  digits optional_fraction optional_exponent

20 20 PENGENAL TOKEN Perhatikan potongan tata bahasa berikut ini : stmt  if expr then stmt | if expr then stmt else stmt |  expr  term relop term | term term  id | num dimana terminal if, then, else, relop, id dan num membentuk himpunan dari rangkaian yang diberikan oleh RD berikut : if  if then  then else  else relop  |>|>= id  letter (letter | digit )* num  digit + (.digit + )?(E(+|-)? digit + )?

21 21 Translation table Tujuan kita adalah menghasilkan lexical analyzer yang mengisolasi lexeme token-token berikutnya dari input buffer dan menghasilkan output berupa pasangan token dan nilai atributnya yang sesuai. Untuk melaksanakan hal ini maka diperlukan translation table seperti di bawah ini. Regular ExpressionTokenNilai Atribut ws-- ifif- thenthen- elseelse- ididpointer pada entri tabel num numpointer pada entri tabel relopNE >relopGT >=relopGE

22 22 TRANSITION DIAGRAM Menyimpan informasi dari karakter yang terbaca oleh pointer forward saat sedang membaca input. Hal ini dilakukan dengan cara berpindah-pindah dari posisi satu ke lainnya saat membaca karakter. Transition Diagram Bersifat Deterministik, dengan ketentuan: –Salah satu state diberi label state awal (posisi) dengan bentuk lingkaran sebagai awal bagan peralihan proses pengenalan token. –Bila ada sisi (tanda panah) dari state cocok dengan karakter input maka kendali akan pergi ke state yang ditunjuk oleh sisi. Jika tidak, pengenalan gagal. –Hanya satu simbol yang keluar dari state yang sama dan kemungkinan lebih dari satu sisi yang keluar dari state yang sama.

23 23 Contoh Transisi diagram Transisi diagram untuk pola >= dan > : start> others = * start letter other letter or digit return (gettoken(), install_id()) gettoken() dan install_id() untuk memperoleh Token dan nilai atribut. Prosedur install_id() berguna untuk akses ke input buffer dimana lexeme diketemukan dan mengembalikan pointer pada entry Tabel Simbol. Transisi diagram identifier dan keywords :

24 24 Contoh Transisi diagram other = > = > = < start return (relop, LE ) return (relop, NE ) return (relop, LT ) return (relop, EQ) return (relop, GE ) return (relop, GT ) * * *

25 25 FINITE AUTOMATA 1.OTOMATA BERHINGGA NON-DETERMINISTIK (Non- Deterministic Finite Automata / NFA) : Model Matematika terdiri dari : –Himpunan state dinyatakan dengan S. –Himpunan simbol input (alfabet) dinyatakan dengan  –Fungsi transisi pindah move, memetakan pasangan state-simbol ke himpunan state. –State S 0 yang disebut sebagai state awal. –Himpunan state F yang disebut sebagai state penerima (accepting state). 2.OTOMATA BERHINGGA DETERMINISTIK (Deterministic Finite Automata / DFA) –Tidak ada peralihan atas input  –Setiap state S & simbol input a, paling banyak satu sisi dengan label a yang meninggalkan S.

26 26 Contoh DFA Contoh di atas adalah graf peralihan (DFA) yang menerima bahasa (a | b)*abb Keuntungan / Kerugian : –DFA lebih cepat menghasilkan pengenal –Ukuran DFA jauh lebih besar dari NFA untuk mengenal RE yang sama

27 27 Contoh NFA Contoh graf transisi NFA : S = { 0,1,2,3} adalah Himpunan State  = {a,b} adalah alfabet simbol input S 0 = {0} ; F = {3} Implementasi fungsi peralihan NFA digunakan Tabel Peralihan (Translation Table) Input Symbol State a b 0{0,1} {0} 1 - {2} 2 - {3}

28 28 KONVERSI DARI RE KE NFA Merupakan salah satu strategi untuk membentuk sebuah recognizer (pengenal) dari sebuah RE. Algoritma THOMSON’S CONSTRUCTION : –Input: RE r pada alfabet  –Output: NFA N yang menerima L(r) –Metode: Menguraikan r menjadi subexpression Gunakan aturan (1) & (2) berikut untuk membentuk NFA untuk setiap simbol dasar dari r (merupakan simbol alfabet atau  ) –Aturan : 1.Untuk , dibentuk NFA : Dimana : i : start state yang baru f : accepting state yang baru NFA ini mengenal {  } i f start 

29 29 Konversi RE ke NFA 2.Untuk a di dalam , bentuk NFA : Dimana: i : start state yang baru f : accepting state yang baru NFA ini mengenal {a} 3.Misalkan N(s) dan N(t) adalah NFA untuk regular expression s dan t a)Untuk RE s|t, bentuk NFA gabungan N(s|t): Dimana: i : start state yang baru f : accepting state yang baru NFA yang terbentuk akan mengenali L(s)  L(t) i f start a f N(s) N(t) i start    

30 30 Konversi RE ke NFA b)Untuk RE st, bentuk NFA gabungan N(st) Dimana: Start state N(s) menjadi start state NFA gabungan Accepting state N(t) menjadi accepting state dari NFA gabungan NFA yang terbentuk mengenali L(s)L(t) c)Untuk RE s*, bentuk NFA gabungan N(s)* Dimana: i : start state yang baru f : accepting state yang baru NFA ini mengenali (L(s))* d)Untuk RE didalam kurung: (s), gunakan N(s) itu sendiri sebagai NFA yang baru. i f start N(s) N(t) f N(s) i     Start

31 31 Sifat-sifat NFA (thomson) Algoritma diatas menghasilkan sebuah NFA N(r) yang memiliki sifat-sifat sebagai berikut : –N(r) mempunyai state paling banyak dua kali jumlah simbol dan operator di dalam r. –N(r) mempunyai tepat satu start state dan satu accepting state. Accepting state tidak memiliki transisi ke luar. –Setiap state di N(r) mempunyai satu transisi keluar untuk sebuah simbol di dalam  atau paling banyak dua transisi keluar untuk simbol  (transisi -  ). Contoh: berdasarkan algoritma tersebut bentuk NFA N(r) dari RE: r = (a | b)* abb

32 32 konversi RE ke DFA Algoritma konversi : Input : Sebuah regular expression r Output :DFA D yang mengenal L(r ). Method : 1.Buatkan syntax tree untuk augmented regular expression (r)#, di mana # adalah simbol unik yang ditambahkan pada akhir (r ). 2.Tentukan nullable, firstpos, lastpos, dan followpos. 3.Buat Dstates, himpunan state D, dan Dtran, transition table untuk D, dengan procedure berikut : I nitially, unmarked state pada Dstates adalah firstpos(root), Di mana root adalah root dari syntax tree (r)#; while ada sebuah unmarked state T pada Dstates do begin mark T; for setiap input symbol a, do begin Misalkan U adalah himpunan posisi yang ada dalam followpos(p) untuk posisi-posisi p dalam T, sedemikian hingga symbol pada posisi p adalah a; if U not empty dan tidak dalam Dstates then tambahkan U sebagai unmarked state ke Dstates; Dtran[T, a] := U end

33 33 Converting Regular Expressions Directly to DFAs We may convert a regular expression into a DFA (without creating a NFA first). First we augment the given regular expression by concatenating it with a special symbol #. r  (r)# augmented regular expression Then, we create a syntax tree for this augmented regular expression. In this syntax tree, all alphabet symbols (plus # and the empty string) in the augmented regular expression will be on the leaves, and all inner nodes will be the operators in that augmented regular expression. Then each alphabet symbol (plus #) will be numbered (position numbers).

34 34 Regular Expression  DFA (cont.) (a|b) * a  (a|b) * a #augmented regular expression  *  | b a # a Syntax tree of (a|b) * a # each symbol is numbered (positions) each symbol is at a leave inner nodes are operators

35 35 followpos Then we define the function followpos for the positions (positions assigned to leaves). followpos(i) -- is the set of positions which can follow the position i in the strings generated by the augmented regular expression. For example, ( a | b) * a # followpos(1) = {1,2,3} followpos(2) = {1,2,3} followpos(3) = {4} followpos(4) = {} followpos is just defined for leaves, it is not defined for inner nodes.

36 36 firstpos, lastpos, nullable To evaluate followpos, we need three more functions to be defined for the nodes (not just for leaves) of the syntax tree. firstpos(n) -- the set of the positions of the first symbols of strings generated by the sub-expression rooted by n. lastpos(n) -- the set of the positions of the last symbols of strings generated by the sub-expression rooted by n. nullable(n) -- true if the empty string is a member of strings generated by the sub-expression rooted by n false otherwise

37 37 How to evaluate firstpos, lastpos, nullable nnullable(n)firstpos(n)lastpos(n) leaf labeled  true  leaf labeled with position i false{i} | c 1 c 2 nullable(c 1 ) or nullable(c 2 ) firstpos(c 1 )  firstpos(c 2 )lastpos(c 1 )  lastpos(c 2 )  c 1 c 2 nullable(c 1 ) and nullable(c 2 ) if (nullable(c 1 )) firstpos(c 1 )  firstpos(c 2 ) else firstpos(c 1 ) if (nullable(c 2 )) lastpos(c 1 )  lastpos(c 2 ) else lastpos(c 2 ) * c 1 truefirstpos(c 1 )lastpos(c 1 )

38 38 How to evaluate followpos Two-rules define the function followpos: 1.If n is concatenation-node with left child c 1 and right child c 2, and i is a position in lastpos(c 1 ), then all positions in firstpos(c 2 ) are in followpos(i). 2.If n is a star-node, and i is a position in lastpos(n), then all positions in firstpos(n) are in followpos(i). If firstpos and lastpos have been computed for each node, followpos of each position can be computed by making one depth-first traversal of the syntax tree.

39 39 Example -- ( a | b) * a #  *  | b a # a {1} {1,2,3} {3} {1,2,3} {1,2} {2} {4} {3} {1,2} {2} green – firstpos blue – lastpos Then we can calculate followpos followpos(1) = {1,2,3} followpos(2) = {1,2,3} followpos(3) = {4} followpos(4) = {} After we calculate follow positions, we are ready to create DFA for the regular expression.

40 40 Algorithm (RE  DFA) Create the syntax tree of (r) # Calculate the functions: followpos, firstpos, lastpos, nullable Put firstpos(root) into the states of DFA as an unmarked state. while (there is an unmarked state S in the states of DFA) do –mark S –for each input symbol a do let s 1,...,s n are positions in S and symbols in those positions are a S ’  followpos(s 1 ) ...  followpos(s n ) move(S,a)  S’ if (S’ is not empty and not in the states of DFA) –put S’ into the states of DFA as an unmarked state. the start state of DFA is firstpos(root) the accepting states of DFA are all states containing the position of #

41 41 Example -- ( a | b) * a # followpos(1)={1,2,3} followpos(2)={1,2,3} followpos(3)={4} followpos(4)={} S 1 =firstpos(root)={1,2,3}  mark S 1 a: followpos(1)  followpos(3)={1,2,3,4}=S 2 move(S 1,a)=S 2 b: followpos(2)={1,2,3}=S 1 move(S 1,b)=S 1  mark S 2 a: followpos(1)  followpos(3)={1,2,3,4}=S 2 move(S 2,a)=S 2 b: followpos(2)={1,2,3}=S 1 move(S 2,b)=S 1 start state: S 1 accepting states: {S 2 } S1S1 S2S2 a b b a

42 42 Example -- ( a |  ) b c * # followpos(1)={2} followpos(2)={3,4} followpos(3)={3,4} followpos(4)={} S 1 =firstpos(root)={1,2}  mark S 1 a: followpos(1)={2}=S 2 move(S 1,a)=S 2 b: followpos(2)={3,4}=S 3 move(S 1,b)=S 3  mark S 2 b: followpos(2)={3,4}=S 3 move(S 2,b)=S 3  mark S 3 c: followpos(3)={3,4}=S 3 move(S 3,c)=S 3 start state: S 1 accepting states: {S 3 } S3S3 S2S2 S1S1 c a b b

43 43 Minimizing Number of States of a DFA partition the set of states into two groups: –G 1 : set of accepting states –G 2 : set of non-accepting states For each new group G –partition G into subgroups such that states s 1 and s 2 are in the same group iff for all input symbols a, states s 1 and s 2 have transitions to states in the same group. Start state of the minimized DFA is the group containing the start state of the original DFA. Accepting states of the minimized DFA are the groups containing the accepting states of the original DFA.

44 44 Minimizing DFA - Example ba a a b b G 1 = {2} G 2 = {1,3} G 2 cannot be partitioned because move(1,a)=2move(1,b)=3 move(3,a)=2move(2,b)=3 So, the minimized DFA (with minimum states) {1,3} a a b b {2}

45 45 Minimizing DFA – Another Example b b b a a a a b Groups: {1,2,3}{4} a b 1->21->3 2->22->3 3->43->3 {1,2}{3} no more partitioning So, the minimized DFA {1,2} {4} {3} b a a a b b

46 46 Some Other Issues in Lexical Analyzer The lexical analyzer has to recognize the longest possible string. –Ex: identifier newval -- n ne new newv newva newval What is the end of a token? Is there any character which marks the end of a token? –It is normally not defined. –If the number of characters in a token is fixed, in that case no problem: + - –But (in Pascal) –The end of an identifier : the characters cannot be in an identifier can mark the end of token. –We may need a lookhead In Prolog: p :- X is 1. p :- X is 1.5. The dot followed by a white space character can mark the end of a number. But if that is not the case, the dot must be treated as a part of the number.

47 47 Some Other Issues in Lexical Analyzer (cont.) Skipping comments –Normally we don’t return a comment as a token. –We skip a comment, and return the next token (which is not a comment) to the parser. –So, the comments are only processed by the lexical analyzer, and the don’t complicate the syntax of the language. Symbol table interface –symbol table holds information about tokens (at least lexeme of identifiers) –how to implement the symbol table, and what kind of operations. hash table – open addressing, chaining putting into the hash table, finding the position of a token from its lexeme. Positions of the tokens in the file (for the error handling).


Download ppt "1 Pertemuan 2 Lexical Analyzer Matakuliah: T0522 / Teknik Kompilasi Tahun: 2005 Versi: 1/6."

Presentasi serupa


Iklan oleh Google