Pohon Sintaks TEKNIK KOMPILASI ANALISIS SINTAKS SHINTA P. SARI Jurusan Informatika Fasilkom Universitas Indo Global Mandiri Berupa pohon penurunan yang menggambarkan bagaimana memperoleh suatu string dengan cara menurunkan symbolsymbol variable menjadi symbol-symbol terminal. Eg : Aturan produksi Bahasa bebas konteks S AB A aa a B bb b Syntax?? himpunan peraturan yang menjelaskan bagaimana simbol peraturan yang menjelaskan bagaimana simbol-simbol bahasa dapat dirangkai bersama untuk membentuk pernyataan (statement) yang berarti. Aturan formal yang mengatur bagaimana seseorang menulis instruksi yang valid dalam pada suatu bahasa Proses Penurunan Left Most Derivation (Terkiri) Simbol variable terletak disebelah kiri yang diperluas terlebih dahulu Right Most Derivation (Terkanan) Simbol variable terletak disebelah kanan yang diperluas terlebih dahulu Eg : Aturan produksi S aas a A SbA ba Analisis Syntax (Parser) Input berupa token dari scanner memeriksa kebenaran sintaks dan menghasilkan serta memproses pohon sintaks Sintaks Bahasa pemrograman dinotasikan dengan Tata Bahasa bebas konteks ( Context Free Grammar) Parse membentuk pohon sintaks (Parse Tree), menggambarkan bagaimana memperoleh suatu string dengan cara menurunkan simbol-simbol variabel menjadi simbol-simbol terminal, sampai tidak ada simbol yang belum tergantikan. Metode Parsing Proses parsing akan melakukan pemerikasaan urutan kemunculan token yang memperhatikan : Rentang waktu ekseskusi Penanganan Kesalahan Penanganan Kode Kategori metode parsing: Top Down Bottom Up 1
Top Down Parsing Kelemahan Brute Force : Top Down memparsing pohon secara pre order Penelusuran dimulai dari root hingga ke leaf pohon sintaks (dari symbol awal hingga terminal) Backtracking : Brute Force No Backtracking : Recursive Descent Parser Mencoba semua aturan produksi sehingga akan menjadi lambat Sulit melakukan backtracking dan pemulihan kesalahan Memakan banyak memori karena perlu mencatat lokasi backtrack Tata Bahasa rekursif kiri tidak dapat ditelusuri, harus diubah dulu A A, dimana = ( V U T)* Bottom Up Parsing Menelusuri rightmost derivation secara terbalik menelusuri pohon dari daun menuju ke root. Biasanya mengurangi string/daun sampai pada akarnya Reduction Only, Shift reduce Parsing Latihan: 1. Buatlah pohon penurunan unutk memeriksa apakah string aaabbabbba dapat diproduksi dari aturan produksi berikut ini! S ab ba A a as baa B b bs abb 2. Gambarlah diagram transisis dari aturan produksi di atas! Brute Force Parsing Metode ini akan melakukan substitusi semua simbol non terminal yang ada. Jika terjadi salah parsing (atau tidak cocok), maka dapat dilakukan backtracking. Contoh : S => aad ab A => b c B => ccd ddc Contoh Kompilasi Misal ingin memparsing : accd S aad S abd : gagal, maka dilakukan backtrack S acd : gagal, maka dilakukan backtrack S ab S accd : berhasil! 2
Contoh mesin FSA Diagram Syntax statement Ekspresi ; ekspresi Term Ekspresi + Term Notasi BNF (Backus-Nour Form) Contoh FSA : Suatu tata bahasa memiliki himpunan simbol terminal/token berikut (ID, PLUS, MINUS, dan INT) token ID untuk karakter huruf a-z, 0-9, token INT untuk digit, token PLUS untuk Penjumlahan dan token MINUS untuk Pengurangan Aturan Produksi bisa dinyatakan dengan notasi BNF BNF menggunakan abstraksi untuk struktur syntax ::= sama identik dengan simbol sama dengan atau < > pengapit simbol non terminal { } Pengulangan dari 0 sampai n kali PLUS + S huruf ID Huruf, Digit Misalkan aturan produksi sbb: E T T+E T-E T a MINUS - Blank Digit INT Digit Notasi BNFnya adalah E ::= <T> <T> + <E> <T> - <E> T ::= a Diagram Syntax Alat bantu (tools) dalam pembuatan parser/ analisis sintaksis BNF: <Block> ::= BEGIN <statement> { SEMICOL <statement>} END Menggunakan simbol persegi panjang untuk non terminal Lingkaran untuk simbol terminal BEGIN Statement END Misalnya E T T+E T-E E T + - ; 3
Contoh Tata Bahasa Sederhana : Syntax Analyzer, Contoh : Terdapat statement : ( A + B ) * ( C + D ) Akan menghasilkan bentuk sintaksis: <factor>, <term> & <expression> Lexical Analysis - Contoh Contoh 1: ada urutan karakter yang disebut dengan statement fahrenheit := 32 + celcius * 1.8, Maka akan diterjemahkan kedalam token-token seperti dibawah ini identifier fahrenheit operator := integer 32 operator penjumlahan + Identifier celcius operator perkalian * real / float 1.8 Parsing: Brute force Memilih aturan produksi mulai dari kiri Meng-expand simbol non terminal sampai pada simbol terminal Bila terjadi kesalahan (string tidak sesuai) maka dilakukan backtrack Algoritma ini membuat pohon parsing secara top-down, yaitu dengan cara mencoba segala kemungkinan untuk setiap simbol non-terminal Contoh suatu language dengan aturan produksi sebagai berikut S aad ab A b c B ccd ddc Misal ingin dilakukan parsing untuk string accd Syntax Analyzer : Pohon Sintaks Parsing: Brute force (i) S (ii) S (iii) S Ekspresi Ekspresi Term a A d a A d b Terjadi kegagalan (iii), dilakukan back track (iv) S (v) S (vi) S Term Faktor Number Ekspresi a A d a B a B c c c d Terjadi kegagalan lagi (iv), dilakukan back-track 4
Parsing: Brute force Brute force : Aturan produksi Kelemahan dari metode-metode brute-force Mencoba untuk semua aturan produksi yang ada sehingga menjadi lambat (waktu eksekusi) Mengalami kesukaran untuk melakukan pembetulan kesalahan Memakan banyak memakan memori, dikarenakan membuat backup lokasi backtrack Grammar yang memiliki Rekursif Kiri tidak bisa diperiksa, sehingga harus diubah dulu sehingga tidak rekursif kiri, Karena rekursif kiri akan mengalami Loop yang terus-menerus Aturan Produksi yang rekursif memiliki ruas kanan (hasil produksi) yang memuat simbol variabel pada ruas kiri Sebuah produksi dalam bentuk A A contoh: S d S B ad B merupakan produksi rekursif kanan = berupa kumpulan simbol variabel dan terminal bentuk produksi yang rekursif kiri A A contoh: S S d B B ad merupakan produksi rekursif Kiri Brute force : Contoh Terdapat grammar/tata bahasa G = (V,T,P,S), dimana V= ( E, T, F ) Simbol NonTerminal (variable) T= ( i, *, /, +, - ) Simbol Terminal S= E Simbol Awal / Start simbol String yang diinginkanadalah i * i aturan produksi (P) yang dicobakan adalah 1. E T T + E T - E T F F * T F / T F i accept (diterima) Produksi yang rekursif kanan akan menyebabkan penurunan tumbuh kekanan, Sedangkan produksi yang rekursif kiri akan menyebabkan penurunan tumbuh ke kiri. Contoh: Context free Grammar dengan aturan produksi sebagai berikut: Brute force : Contoh 2. E T E+T E-T T F T* F T / F F i Dalam Banyak penerapan tata-bahasa, rekursif kiri tidak diinginkan, Untuk menghindari penurunan kiri yang looping, perlu dihilangkan sifat rekursif, dengan langkah-langkah sebagai berikut: accept (diterima) Meskipun ada rekursif kiri, tetapi tidak diletakkan sebagai aturan yang paling kiri 3. E E+T E-T T T T* F T / F F F i Rekursif kiri, program akan mengalami loop Pisahkan Aturan produksi yang rekursif kiri dan yang tidak; misalnya Aturan produksi yang rekursif kiri A A 1 A 2... A n Aturan produksi yang tidak rekursif kiri A 1 2... n 5
Kalau pun tidak mungkin menghilangkan rekursif kiri dalam penyusunan aturan produksi maka produksi rekursif kiri diletakkan pada bagian belakang atau terkanan, hal ini untuk menghindari looping pada awal proses parsing lakukan per-ganti-an aturan produksi yang rekursif kiri, sebagai berikut: 1. A 1 Z 2 Z... n Z 2 Z 1 2... n Metode ini jarang digunakan, karena semua kemungkinan harus ditelusuri, sehingga butuh waktu yang cukup lama serta memerlukan memori yang besar untuk penyimpanan stack (backup lokasi backtrack) 3 Z 1 Z 2 Z... n Z Metode ini digunakan untuk aturan produksi yang memiliki alternatif yang sedikit Pergantian dilakukan untuk setiap aturan produksi dengan simbol ruas kiri yang sama, bisa muncul variabel Z1, Z2 dst, sesuai dengan variabel yang menghasilkan rekurisif kiri dengan Recursive Descent Parser Parsing: Descent Parser Salah satu cara untuk meng-aplikasikan bahasa context free Contoh: Tata Bahasa Context free Simbol terminal maupun simbol variabelnya sudah bukan sebuah karakter S Sab asc dd ff Sbd Pisahkan aturan produksi yang rekursif kiri S Sab Sbd Ruas Kiri untuk S: 1=ab, 2=bd Aturan Produksi yang tidak rekursif kiri S asc dd ff dari situ didapat untuk Ruas Kiri untuk S: 1 = asc, 2 = dd, 3= ff Besaran leksikal sebagai simbol terminalnya, besaran syntax sebagai simbol variablenya /non terminalnya Dengan cara penurunan secara recursif untuk semua variabel dari awal sampai ketemu terminal Tidak pernah mengambil token secara mumdur (back tracking) Beda dengan turing yang selalu maju dan mundur dalam melakukan parsing Langkah berikutnya adalah penggantian yang rekursif kiri S Sab Sbd, dapat digantikan dengan Aturan Produksi memakai Recursif Descent : 1. S ascz1 ddz1 ffz1 2. Z1 ab bd 3. Z1 abz1 bdz1 Hasil akhir yang didapat setelah menghilangkan rekursif kiri adalah sebagai Berikut: S asc dd ff S ascz1 ddz1 ffz1 Z1 ab bd Z1 abz1 bdz1 Semua simbol variabel dijadikan prosedur/fungsi Jika ketemu simbol terminal pada aturan produksi, maka panggil prosedurnya Penelusuran bersifat top down mengikuti sintaks sesuai pola pada diagram sintaks Fungsi/prosedur ditulis untuk setiap non terminal dari suatu produksi. Setiap fungsi/prosedur akan melemparkan nilai benar atau salah bergantung pada apakah fungsi tersebut mengenali substring yang diterima sebagai ekspansi dari non terminal. 6
Contoh : Grammar dengan BNF : <program> ::= t_prog t_id t_semicol <block> t_dot <block> ::= t_begin <statement> {t_semicol <statement>} t_end <statement> ::= t_id t_ass <simple exp> t_if <exp> t_then <statement> t_if <exp> t_then <statement> t_else <statement> <exp> ::= <simple_exp> t_eq <simple exp> <simple_exp> t_lt <simple_exp> <simple_exp> t_gt <simple_exp> Dst. Penggalan program untuk grammar tsb 7