TUGAS TEKNIK KOMPILASI

Oleh : Handika Teguh W. 083112706450014 TEKNIK INFORMATIKA UNIVERSITAS NASIONAL

DAFTAR ISI BAB I COMPILER BAB II INPUT DAN ANALISA LEKSIKAL BAB III TATA BAHASA BAB IV CONTEXT FREE GRAMMAR BAB V TOP DOWN PARSING BAB VI SCANNER BAB VII ANALISIS SYNTAX BAB VIII PREDIKTIVE PARSER BAB IX ANALISIS SEMANTIK , KODE ANTARA DAN PEMBANGKITAN KODE

BAB I COMPILER 1. Sebutkan beberapa tingkatan bahasa berdasarkan tingkat ketergantungannya dengan mesin dan jelaskanlah ! 1. Bahasa Mesin Merupakan bentuk terendah dari bahasa komputer, setiap instruksi dalam program diprepresentasikan dengan kode numerik , yang secara fisik berupa deretan angka 0 dan 1 Sekumpulan instruksi dalam bahasa mesin bisa dibentuk menjadi microcode, yaitu semacam prosedure dalam bahasa mesin. 2. Bahasa Assembly Merupakan bentuk simbolik dari bahasa mesin. Setiap kode operasi memiliki kode simbolik, misalnya: ADD untuk penjumlahan ( Addition) dan MUL untuk perkalian ( multiplication). 3. Bahasa Tingkat Tinggi (User Oriented) Disebut tingkat tinggi karena lebih dekat dengan manusia. Bahasa ini memberikan fasilitas lebih banyak, kontrol program yang terstruktur, kalang(nested), block, dan prosedur. Contohnya: Pascal, Basic. 4. Bahasa Yang problem oriented Bahasa ini memungkinkan penyelesaian untuk sustu masalah atau aplikasi yang spesifik. Contohnya: SQL (Stucture Query Language) untuk aplikasi database, Bahasa yang Problem Oriented kadang dimasukkan pula sebagai bahasa tingkat tinggi.

2. Sebutkan keuntungan menggunakan bahasa tingkat tinggi ! 1. Kemudahan untuk dipelajari, tidak membutuhkan latar belakang pengetahuan pengetahuan mengenai perangkat keras (hardware) karena sifatnya yang machine independent. 2. Lebih mendekati permasalahan yang akan diselesaikan. 3. Pemrograman tidak perlu mengetahui bagaimana representasi data k edalam bentuk internal memory. Kemampuan untuk konversi data, seperti : floating point misalnya sudah tersedia. Pekerjaan tersebut ditangani suatu sistem yang mentranslasikan program bahasa tingkat tinggi ke dalam bahasa mesin. 4. Memberikan banyak pilihan struktur kontrol seperti kondisional (IF-THEN-ELSE). 5. Program lebih mudah di debug. 6. Kemampuan Stuktur data yang lebih baik sehingga memfasilitasi pengekspresian suatu solusi dari masalah tertentu. 7. Karena ketersediaan feature seperti prosedur, bahasa tingkat tinggi memungkinkan suatu deskripsi modular dan hirarkis dalam pemrograman . Suatu pekerjaan bisa diserahkan pada suatu tim , dan memungkinkan pembagian kerja. 8. Kompatibilitas dan dokumentasi yang lebih baik dalam pengembangan program.
9. Tidak bergantung pada mesin ( machine independent) sehingga memiliki portabilitas

tinggi. Program hanya memerlukan sedikit perubahan untuk bisa dieksekusi pada mesin yang berbeda arsitektur internalnya dan instruksi bahasa mesinnya. Portabilitas ini akan mengurangi biaya. 3. Sebutkan dan jelaskan jenis-jenis dari translator ! 1. Assembler Source code adalah bahasa assembly, object code adalah bahasa mesin. Contohnya: Turbo Assembler dan Macro Assembler.

Gbr 1.3. Assembler
2. Kompilator (Compiler)

Source code adalah bahasa tingkat tinggi ( misal bahasa Pascal) , object code adalah bahasa mesin atau bahasa assembly. Source code dan data diproses pada saat yang berbeda. Contohnya : Turbo Pascal. Compile time adalah saat pengubahan source code ke object code . Run time adalah saat eksekusi object code.

Compile time

Run time Gambar1.4. Proses kompilasi

3. Interpreter Interpreter tidak membangkitkan object code, hasil translasi hanya dalam bentuk internal. Contoh interpreter: BASICA/GW-BASIC, LISP,SMALLTALK. Source code dan data diproses pada saat yang sama.

Run time Gambar 1.5. Proses Interpretasi

4. Jelaskan fungsi dari scanner,parser,dan analisis semantic ! • • • Scanner : memecah program sumber menjadi besaran leksik / token. Parser : memeriksa kebenaran dan urutan kemunculan token. Analisis Semantik : melakukan analisis semantik, biasanya dalam realisasi akan digabungkan dengan intermediate code generator ( bagian yang berfungsi membangkitkan kode antara)

5. Buatlah program menggunakan Turbo C++ dan lakukan compile pada program tersebut ! #include<conio.h> #include<iostream.h> #include<math.h> void main() { int no,n1,n2,n3,kali,tam,krg,bg,md; cout<<" MENU OPERATOR "<<endl; cout<<" ================================ "<<endl; cout<<" 1. OPERATOR TAMBAH "<<endl; cout<<" 2. OPERATOR KALI "<<endl;

cout<<" 3. OPERATOR KURANG "<<endl; cout<<" 4. OPERATOR BAGI "<<endl; cout<<" 5. OPERATOR MOD "<<endl; cout<<" 6. OPERATOR NAIK "<<endl; cout<<" 7. OPERATOR TURUN "<<endl; cout<<" 8. KELUAR PROGRAM "<<endl; cout<<" ================================ "<<endl; cout<<" switch(no) { case 1: cout<<" OPERATOR TAMBAH "<<endl; cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 1 =";cin>>n1; cout<<" Nilai 1 Adalah "<<n1<<endl; cout<<" Masukkan Nilai 2 =";cin>>n2; cout<<" Nilai 2 Adalah "<<n2<<endl; cout<<" Masukkan Nilai 3 =";cin>>n3; cout<<" Nilai 3 Adalah "<<n3<<endl; tam=n1+n2+n3; cout<<" TOTAL OPERATOR TAMBAH = "<<tam<<endl; cout<<" ================================ "<<endl; break; case 2: cout<<" OPERATOR KALI "<<endl; cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 1 =";cin>>n1; cout<<" Nilai 1 Adalah "<<n1<<endl; cout<<" Masukkan Nilai 2 =";cin>>n2; cout<<" Nilai 2 Adalah "<<n2<<endl; MASUKKAN NOMOR : ";cin>>no; cout<<" ================================ "<<endl;

cout<<" Masukkan Nilai 3 =";cin>>n3; cout<<" Nilai 3 Adalah "<<n3<<endl; kali=n1*n2*n3; cout<<" TOTAL OPERATOR KALI = "<<kali<<endl; cout<<" ================================ "<<endl; break; case 3: cout<<" OPERATOR KURANG "<<endl; cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 1 =";cin>>n1; cout<<" Nilai 1 Adalah "<<n1<<endl; cout<<" Masukkan Nilai 2 =";cin>>n2; cout<<" Nilai 2 Adalah "<<n2<<endl; cout<<" Masukkan Nilai 3 =";cin>>n3; cout<<" Nilai 3 Adalah "<<n3<<endl; krg=n1-n2-n3; cout<<" TOTAL OPERATOR KURANG = "<<krg<<endl; cout<<" ================================ "<<endl; break; case 4: cout<<" OPERATOR BAGI "<<endl; cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 1 =";cin>>n1; cout<<" Nilai 1 Adalah "<<n1<<endl; cout<<" Masukkan Nilai 2 =";cin>>n2; cout<<" Nilai 2 Adalah "<<n2<<endl; bg=n1/n2; cout<<" TOTAL OPERATOR BAGI = "<<bg<<endl; cout<<" ================================ "<<endl; break; case 5:

cout<<"

OPERATOR MOD "<<endl;

cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 1 =";cin>>n1; cout<<" Nilai 1 Adalah "<<n1<<endl; cout<<" Masukkan Nilai 2 =";cin>>n2; cout<<" Nilai 2 Adalah "<<n2<<endl; md=n1-n2; cout<<" TOTAL OPERATOR MOD = "<<md<<endl; cout<<" ================================ "<<endl; break; case 6: cout<<" OPERATOR NAIK "<<endl; cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 2 =";cin>>n2; cout<<" Nilai 2 Adalah "<<n2<<endl; ++n2; cout<<" Nilai = "<<n2<<endl; cout<<" ================================ "<<endl; break; case 7: cout<<" OPERATOR TURUN "<<endl; cout<<" ================================ "<<endl; cout<<" Masukkan Nilai 1 =";cin>>n1; cout<<" Nilai 1 Adalah "<<n1<<endl; ++n1; cout<<" Nilai = "<<n1<<endl; cout<<" ================================ "<<endl; break; default: cout<<" Created By DHIKA "<<endl; cout<<" =============================================== "<<endl;

break; } getch(); }

BAB II INPUT DAN ANALISA LEKSIKAL 1. Jelaskan apa yang dimaksud dengan analisa leksikal ! Membaca program sumber, karakter demi karakter. Sederetan (satu atau lebih) karakter dikelompokkan menjadi satu kesatuan mengacu kepada pola kesatuan kelompok karakter (token) yang ditentukan dalam bahasa sumber. 2. Sebutkan aspek-aspek yang harus diperhatikan saat merancang sebuah bahasa !
1. Spesifikasi leksikal,

Misalnya setiap kata harus tersusun atas huruf mati dan huruf hidup yang disusun bergantian, atau setiap token harus dimulai dengan huruf dan selanjutnya boleh diikuti oleh huruf atau angka.
2. Spesifikasi sintaks,

Misalnya setiap kalimat mengikuti pola subyek- predikat- obyek atau ekspresi for-do mengikuti pola for-identifier-:= identifier-toidentifier-do-ekspresi.
3. Aturan-aturan semantik,

Misalnya kata yang mendahului kata kerja haruslah kata benda yang menggambarkan sesuatu yang hidup dan berkaki, atau operasi perkalian hanya bisa dilakukan antara dua operan dengan tipe yang sama. 3. Apa pengertian dari list error ? Menampilkan kesalahan-kesalahan yang terjadi pada suatu baris. 4. Berikan penjelasan tentang penganalisa leksikal ! Membaca program sumber, karakter demi karakter. Sederetan (satu atau lebih) karakter dikelompokkan menjadi satu kesatuan mengacu kepada pola kesatuan kelompok karakter (token) yang ditentukan dalam bahasa sumber. Kelompok karakter yang membentuk sebuah token dinamakan lexeme untuk token tersebut. Setiap token yang dihasilkan disimpan di dalam tabel simbol. Sederetan karakter yang tidak mengikuti pola token akan dilaporkan sebagai token tak dikenal (unidentified token). 5. Berikan penjelasan tentang penganalisa syntax ! Memeriksa kesesuaian pola deretan token dengan aturan sintaks yang ditentukan dalam bahasa sumber. Sederetan token yang tidak mengikuti aturan sintaks akan dilaporkan sebagai kesalahan sintaks (sintax error). Secara logika deretan token yang bersesuaian dengan sintaks tertentu akan dinyatakan sebagai pohon parsing (parse tree).

BAB III TATA BAHASA

1. Sebutkan penggolongan bahasa menurut hirarki Chomsky ! 1. Grammar tipe ke-0 : Unrestricted Grammar (UG) Ciri : α, β ∈ (V T |VN )*, |α |> 0

2. Grammar tipe ke-1 : Context Sensitive Grammar (CSG) Ciri : α, β ∈ (V T |VN )*, 0 < |α | ≤ |β |

3. Grammar tipe ke-2 : Context Free Grammar (CFG) Ciri : α ∈ V N , β ∈ (V T |VN )*

4. Grammar tipe ke-3 : Regular Grammar (RG) Ciri : α ∈ V N , β ∈ {V T , V T VN } atau α ∈ V N , β ∈ {V T , V N VT }

2. Apa yang dimaksud dengan diagram keadaan ? Jelaskanlah !

Diagram Keadaan (State Transition Diagram ) digunakan untuk mendapatkan token (token adalah simbol terminal pada teori bahasa automata), yaitu melakukan analisis leksikal terhadap program sumber. 3. Sebutkan fungsi dari notasi BNF dan gambarkan simbolnya ! Aturan –aturan produksi dapat dinyatakan dalam bentuk BNF (Backus Naur Form/ Backus Norm Form ). Notasi BNF telah banyak dipakai untuk melakukan definisi formal bahasa pemrograman. ::= | <> {} Identik dengan simbol pada aturan produksi Idem dengan simbol serupa pada aturan produksi Mengapit simbol variabel / non terminal Pengulangan 0 sampai n kali

4. Buatlah diagram sintaksnya dari aturan produksi T → F*T | F/ T | F T

*

/
5. Buatlah diagram BNF dari aturan produksi E → T | T+E | T- E, T → a Notasi BNF : E ::= <T> | <T> + <E> | <T>- <E>, T ::= a

BAB IV CONTEXT FREE GRAMMAR 1. Tuliskan bentuk umum dari CFG! CFG : A → α , A ∈V N, α ∈(V N | V T )* 2. Buatkan derivasi dan parsing dari G = {I → HI HIA, H → abc...z, A → 012...9} dengan I adalah simbol awal. Berikut ini kedua cara analisa sintaks untuk kalimat x23b. cara 1 (derivasi) I ⇒ IH ⇒ IAH ⇒ IAAH ⇒ HAAH ⇒ xAAH ⇒ x2AH ⇒ x23H ⇒ x23b H x 2 I A 3 I A b I H cara 2 (parsing) I

3. Sebutkan macam-macam metoda parsing dan jelaskan ! Ada 2 metoda parsing : top-down dan bottom-up.  Parsing top-down : Parsing dimulai dari simbol awal S sampai kalimat x
 Parsing bottom-up :

Parsing dimulai dari kalimat x sampai simbol awal S 4. Jelaskan tentang metoda brute force ! Kelas metoda dengan backup, termasuk metoda Brute-Force, adalah kelas metoda parsing yang menggunakan produksi alternatif, jika ada, ketika hasil penggunaan sebuah produksi tidak sesuai dengan simbol input. Penggunaan produksi sesuai dengan nomor urut produksi. 5. Sebutkan dua kelas metoda parsing top down ! 1. kelas metoda dengan backup, Contoh: metoda Brute-Force 2. kelas metoda tanpa backup Contoh: metoda recursive descent.

BAB V TOP DOWN PARSING 1. Jelaskan perbedaan antara parsing top down dan parsing bottom up ! Parsing top-down : Diberikan kalimat x sebagai input. Parsing dimulai dari simbol awal S sampai kalimat x nyata (atau tidak nyata jika kalimat x memang tidak bisa diturunkan dari S) dari pembacaan semua leaf dari pohon parsing jika dibaca dari kiri ke kanan. Parsing bottom-up : Diberikan kalimat x sebagai input. Parsing dimulai dari kalimat x yang nyata dari pembacaan semua leaf pohon parsing dari kiri ke kanan sampai tiba di simbol awal S (atau tidak sampai di S jika kalimat x memang tidak bisa diturunkan dari S) 2. Jelaskan ketentuan produksi yang digunakan pada metode recursive descent ! Jika terdapat dua atau lebih produksi dengan ruas kiri yang sama maka karakter pertama dari semua ruas kanan produksi tersebut tidak boleh sama. Ketentuan ini tidak melarang adanya produksi yang bersifat rekursi kiri. 3. Berikan contoh GPS ! I⇒IH ⇒HH ⇒Hb Hb adalah sentensial dan b adalah simple frase (dibandingkan dengan Q1β Q2 maka Q= H, β = b, dan Q = ε) Perhatikan : simple frase (b) adalah yang terakhir diturunkan I⇒IH ⇒Ib ⇒Hb Hb adalah sentensial dan H adalah simple frase (dibandingkan dengan Q1β Q2 maka Q= ε, β = H, dan Q = b) Perhatikan : simple frase (H) adalah yang terakhir diturunkan

4. Gambarkan relasi preseden dan GPS !

• •

Relasi preseden adalah relasi antara 2 simbol grammar (baik V T maupun V N ) dimana paling tidak salah satu simbol tersebut adalah komponen handel. Misalkan S dan R adalah 2 simbol. Ada 3 relasi preseden yang : ←, ↔ , dan →

Relasi : R → S

Relasi : R ↔ S

Relasi : R ← S

5. Berikan contoh metode brute ! Terdapat grammar/tata bahasa G = (V,T,P,S), dimana V= (“E”,”T”,”F”) T= (“i”,”*”,”/” ,”+”,”-”) S=”E” Simbol NonTerminal (variable) Simbol Terminal

Simbol Awal / Start simbol

String yang diinginkan adalah i * i aturan produksi (P) yang dicobakan adalah 1. E → T | T + E | T - E T→F|F*T|F/T F→i 2. E → T | E+T | E-T T → F | T* F | T / F F→i 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.

BAB VI SCANNER

1. Sebutkan tugas-tugas scanner ! 1. 2. 3. 4. 5. 6. 7. Melakukan pembacaan kode sumber dengan merunut karakter demi karakter. Mengenali besaran leksik Mentransformasi menjadi sebuah token dan menentukan jenis tokennya. Mengirimkan token. Membuang/mengabaikan blank dan komentar dalam program. Menangani kesalahan. Menangani tabel simbol.

2. Jelaskan dan gambarkan posisi penganalisa sintaks (parser) !

- Deretan token : dihasilkan oleh Penganalisa Leksikal (Scanner) - Pohon parse : suatu pohon dimana akarnya (root) adalah simbol awal grammar (starting symbol), setiap node dalam (inner node) adalah simbol nonterminal, dan daunnya (leaf) dibaca dari kiri ke kanan adalah deretan token masukan.

3. Apa yang dimaksud dengan kesalahan syntax ?! Syntax terjadi jika pola deretan token tidak memenuhi ketentuan pola yang telah ditentukan grammar untuk parser. 4. Mengapa grammar yang terpilih untuk melakukan scanner harus grammar RG,bukan CFG ?!

Karena perbedaan cara pandangRG dengan CFG terhadap sebuah token yang mengalir antara scanner dan parser. BagiRG (scanner) sebuah token (kecuali reserve word) adalah sebuah kalimat dimana setiapkarakter pembentuk token tersebut adalah simbol terminal. Sebaliknya bagi CFG (parser) sebuah token adalah sebuah simbol terminal dimana sederetan tertentu token akan membentuk sebuah kalimat. 5. Apa yang dimaksud dengan pohon parser ? suatu pohon dimana akarnya (root) adalah simbol awal grammar (starting symbol), setiap node dalam (inner node) adalah simbol nonterminal, dan daunnya (leaf) dibaca dari kiri ke kanan adalah deretan token masukan.

BAB VII ANALISIS SYNTAX

1. Apa yang dimaksud dengan tree ? suatu graph terhubung tidak sirkuler, yang memiliki satu simpul (node)/vertex disebut akar (root) dan dari situ memiliki lintasan ke setiap simpul. 2. Bagaimana cara melakukan parsing? • Penurunan terkiri ( leftmost derivation) Simbol variabel terkiri yang diperluas terlebih dahulu. • Penurunan terkanan ( rightmost derivation) Simbol variabel terkanan yang diperluas terlebih dahulu. 3.Berikan contoh parsing dengan penurunan terkiri ! S → a AS | a, A → SbA | ba

Penurunan kiri : S => aAS => aSbAS => aabAS => aaabbaS => aabbaa 4.Berikan contoh parsing dengan penurunan terkini ! S → a AS | a, A → SbA | ba S => aAS

=> aAa => aSbAa => aSbbaa => aabbaa 5. Bagaimana ciri-ciri metode recursive descent parser ? Secara rekursif menurunkan semua variabel dari awal sampai bertemu terminal dan tidak pernah mengambil token secara mundur (no back-track). Metode parser yang digunakan adalah LL(1) parser yaitu memparsing satu simbol non terminal dengan metode top down parsing yang tidak mengandung left recursive

BAB VIII PREDICTIVE PARSER 1. Gambarkan model dari predictive parser !

2. Apa yang dimaksud dengan stack ? berisi simbol grammar (V N atau V T ). Pada keadaan awal stack hanya berisi $ danS (simbol awal). 3. Jelaskan kedua fungsi dari parsing M table ! Kedua fungsi tersebut adalah First(X), X ∈(V N | VT ) dan Follow(Y), Y ∈V N . First(X) adalah himpunan simbol terminal yang merupakan simbol pertama dari X atau merupakan simbol pertama dari simbol-simbol yang dapat diturunkan dari X. Follow(Y) adalah himpunan simbol terminal yang dapat muncul tepat di sebelah kanan Ymelalui nol atau lebih derivasi. 4. Apa yang dimaksud dengan parsing M table ! array 2 dimensi M(A,a), dimana A adalah simbol nonterminal dan adalah simbol terminal (token) atau simbol $. Nilai M(A,a) adalah :sebuah produksi A → α atau tanda-tanda kesalahan (keduanya akan dibahas kemudian) 5. Diketahui grammar E  TE’,buatkanlah algoritma parsing tabelnya ! ◊ E → TE’ : Karena : First(TE’) = Fisrt(T) = {(, id} maka menurut (1a) :M(E, () = M(E, id) = E → TE’

BAB IX ANALISIS SEMANTIK , KODE ANTARA DAN PEMBANGKITAN KODE

1. Apa fungsi dari semantic analyzer secara global !? Secara global, fungsi dari semantic analyzer adalah untuk menentukan makna dari serangkaian instruksi yang terdapat dalam program sumber. Fungsi ini adalah sesuatu yang unik dan berbeda dengan bagian lain dari keseluruhan proses kompilasi. 2. Jelaskan pengecekan yang dilakukan oleh analisis semantic ! a. Memeriksa keberlakukan nama-nama meliputi pemeriksaan berikut. Duplikasi Terdefinisi

b. Memeriksa tipe. Melakukan pemeriksaan terhadap kesesuaian tipe dalam statement- statement. 3. Apa yang dimaksud dengan kode antara ? Kode antara (intermediate code) adalah sebuah representasi yang disiapkan untuk mesin abstrak tertentu. 4. Apa kegunaan dari kode antara ? • Untuk memperkecil usaha dalam membangun kompilator dari sejumlah bahasa ke sejumlah mesin. Dengan adanya kode antara yang lebih machine independent maka kode antara yang dihasilkan dapat digunakan lagi pada mesin lainnya. Proses optimasi masih lebih mudah. Beberapa strategi optimisasi lebih mudah dilakukan pada kode antara daripada pada program sumber atau pada kode assembly dan kode mesin. Bisa melihat program internal yang gampang dimengerti. Kode antara ini akan lebih mudah dipahami daripada kode assembly atau kode mesin.

5. Jelaskan tentang notasi postfix ! Sehari-hari kita biasa menggunakan operasi dalam notasi infix ( letak operator di tengah). Pada notasi Postfix operator diletakkan paling akhir maka disebut juga dengan notasi Sufix atau reverse Polish.Sintaks notasi Postfix; < operan> < operan> < operator>.

Sign up to vote on this title
UsefulNot useful