Materi Kuliah Teknik Kompilasi
TEKNIK
KOMPILASI
Gopa Kustriono Team Penyusun : ZulfiandriT U J U A N T U J U A N
Mengetahui Penerapan konsep ilmu komputer pada perilaku komputer yaitu algoritma, arsitektur komputer, stuktur data maupun penerapan teori bahasa dan automata
Nymeyer, Prentice Hall, 1996 Practice and principles of Compiler building with C, Henk Alblas, Albert Introduction to The theory of computation, Michael sipser, PWS publishing Company, 1997
The Essence of Compilers, Robin Hunter,Prentice Hal Europe, 1999
& Son, 2000 Modern Compiler Design, Dick Grune, Henri E. Bal, Et all, John Wiley
Bahasan Materi Kuliah
Bahasan Materi Kuliah
Pendahuluan: arti dari Kompilasi Translator: Compiler dan interpreter Bahasa Pemrograman Pembuatan Compiler Konsep bahasa dan Notasi Hirarki Comsky Aturan Produksi Diagram state Notasi BNF Diagram Syntax
Bahasan Materi Kuliah
Bahasan Materi Kuliah
Beberapa translator Struktur Compiler Lexical Analysis Analysis Syntax Analysis Semantics Error Handling
Teknik :
Metode atau Cara
Kompilasi : Proses mengabungkan serta menterjermahkan sesuatu (source program) menjadi bentuk lain
Compile :
To translate a program written in a high-level
Translator : Compiler & Translator : Compiler & Interpreter Interpreter Translator :
Adalah suatu program dimana mengambil input
sebuah program yang ditulis pada satu bahasa
program (source language) ke bahasa lain (The object on target language) Jika source language adalah high level language, seperti cobol, pascal, fortran maka object
language adalah low-level language atau mesin
Kenapa perlu Kenapa perlu
Dengan bahasa mesin adalah bahasa bentuk bahasa
Translator ? Translator ?
bagian komputer seperti bits, register & sangat primitive terendah komputer, berhubungan langsung dengan bagian programmer yang membuat program dengan bahasa Jawaban atas pertanyaan ini akan membingungkan bagi Bahasa mesin adalah tidak lebih dari urutan 0 dan 1 mesin.
micro-code, semacam prosedur dalam bahasa mesin Instruksi dalam bahasa mesin bisa saja dibentuk menjadi Bagaimana dengan orang tidak mengerti bahasa mesin
Ada Beberapa Translator Ada Beberapa Translator 1. Assembler Source code adalah bahasa assembly, Object code adalah bahasa mesin *.asm Assembler *.asm Assembler *.exe /*.com Object code *.exe /*.com Object code
2. Compiler Source code adalah bahasa tingkat tinggi, object code
Interpreter tidak menghasilkan bentuk object code, tetapi hasil translasinya hanya dalam bentuk internal, dimana program induk harus selalu ada-berbeda dengan compiler
Source code Source code Translator Translator Hasil Hasil Hasil Hasil Source code Source code Execution Execution Data Data Compile r Compile r Object Code Object Code
Translator : Compiler & Interpreter
Translator : Compiler & Interpreter
OBJECT PROGRAM Source Program Compiler ERROR MESSAGES COMPILER vs INTERPRETER menangkap beberapa kesalahan pada 1 baris kode sumber pada kode sumber secara sekaligus. Kalau Interpreter cuma bisa Compiler bisa menangkap berbagai kesalahan dalam 1 program Biasanya program yang dihasilkan compiler lebih cepat dari suatu saat waktu pelaksanaan program dengan interpreter. dijalankan mesin / komputer (executable). Kalau Interpreter dan harus digabungkan / dilink menjadi bentuk yang dapat
Kalau compiler menghasilkan kode antara (misal object code)
biasanya tidak menghasilkan kode antara. COMPILER vs INTERPRETER
kode objek dan linking / penggabungan kode objek dengan library.
mesin dilakukan dalam 2 tahap terpisah, yaitu parsing / pembuatan
Kalau dengan kompiler, maka pembuatan kode yang bisa dijalankan Kalau compiler membutuhkan linker untuk menggabungkan kode Kalau interpreter tidak ada proses terpisah.yang bisa dijalankan oleh mesin. Kalau interpreter tidak butuh linker.
objek dengan berbagai macam library demi menghasilkan suatu kode mengubah suatu modul / kode objek kecil, maka harus dilakukan program-program kecil. Kalau compiler agak repot karena untuk Interpreter cocok untuk membuat / menguji coba modul / sub-routine / yang diperlukan.proses linking / penggabungan kembali semua objek dengan library
Proses kompilasi dikelompokkan ke dalam dua kelompok besar : 1. analisa : program sumber dipecah-pecah dan dibentuk menjadi bentuk antara (inter- 2.
mediate representation)
sintesa : membangun program sasaran yang diinginkan dari
Fase-fase proses sebuah
kompilasiPenganalisa 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 tokendinamakan lexeme untuk token tersebut. Setiap
token yang dihasilkan disimpan di dalam tabelsimbol. Sederetan karakter yang tidak mengikuti
Penganalisa Sintaks 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 Penganalisa Semantik memeriksa token dan ekspresi dari batasan- batasan yang ditetapkan. Batasan-batasan tersebut misalnya :
a. panjang maksimum token identifier adalah 8 karakter,
b. panjang maksimum ekspresi tunggal adalah 80
karakter, c. nilai bilangan bulat adalah -32768 s/d 32767,Pembangkit Kode Antara kan pohon parsing. Pohon parse selanjutnya membangkitkan kode antara (intermediate code) berdasar-
translator). Hasil penerjemahan ini biasanya merupakan
penerjemah berdasarkan sintak (syntax-directed diterjemahkan oleh suatu penerjemah yang dinamakan tiga alamat bisa berbentuk quadruples (op, arg1, arg2, representasi program untuk suatu mesin abstrak. Perintah perintah tiga alamat (three-address code) yang merupakan (strip, dash)argumen dinyatakan dengan menetapkan arg2 dengan -
result), tripels (op, arg1, arg2). Ekspresi dengan satuPengoptimal kode melakukan optimasi (penghematan space dan waktu komputasi), jika mungkin, terhadap kode antara
Pembangkit Kode Mesin membangkitkan kode dalam bahasa target tertentu (misalnya bahasa mesin)
Contoh
Kompila
si
View dari programmer
View dari programmer
Mesin View
Mesin View
Pembuatan compiler Pembuatan compiler Bahasa mesin Bahasa mesin kemungkinannya untuk membuat Sangat sukar dan sangat sedikit mesin, manusia susah mempelajari bahasa compiler dengan bahasa ini, karena Sangat tergantung pada mesin,
Pembuatan compiler Pembuatan compiler Assembly
Assembly
Hasil dari program mempunyai Ukuran yang
relatif kecil Sulit dimengerti karena statement/perintahnya singkat-singkat, butuh usaha yang besar untuk membuat
Pembuatan compiler Pembuatan compiler Bahasa Tingkat Tinggi (high level language) Bahasa Tingkat Tinggi (high level language) Lebih mudah dipelajari Fasilitas yang dimiliki lebih baik (banyak) pascal dengan menggunakan bahasa C Memiliki ukuran yang relatif besar, misal membuat compiler tahapan tambahan.
Untuk mesin yang berbeda perlu dikembangkan tahapan-
Pembuatan compiler Pembuatan compiler BootStrap
BootStrap
Untuk membangun sesuatu yang besar, dibangun/dibuat dulu bagian intinya (niklaus Wirth - saat membuat pascal compiler)
BootStrap BootStrap PO dibuat dengan assembly, P1 dibuat dari P0, dan P2 dibuat dari P1, jadi compiler untuk bahasa P dapat dibuat tidak Po Po P 1 P 2
Contoh dari source program
ke dalam kode mesin Source code Assembly Language Machine language ELSE Go to D Go to 23343 GOTO DONE If equal go to C If = go to 23883IF COUNT =10 Compare A to B Compare 3477 2883 ENDIF GOTO AGAIN 10010101001010001010100 Actual machine code
DEFINISI “bahasa kata. Kata adalah unit terkecil komponen bahasa yang tidak Bahasa adalah kumpulan kalimat. Kalimat adalah rangkaian sumber” Kalimat-kalimat : ‘Seekor kucing memakan seekor tikus.’ bisa dipisah-pisahkan lagi. ‘Budi kick a ball.’ adalah dua contoh kalimat lengkap kalimat lengkap Bahasa Indonesia. ‘A cat eats a mouse’ dan dan ‘Budi menendang sebuah bola.’ adalah dua contoh kalimat lengkap dalam Bahasa Pemrograman Pascal. start to finish do A[i] := B[i]*sin(i*pi/16.0).’ adalah dua contoh
Bahasa Inggeris. ‘if a2 < 9.0 then b2 := a2+a3;’ dan ‘for i :=
Dalam bahasa pemrograman kalimat lebih dikenal sebagai Bahasa Tingkat Tinggi Bahasa Tingkat Tinggi Bahasa yang lebih dikenal oleh manusia, maksudnya adalah statement
(Pemrograman ) (Pemrograman ) (inggris), yang digunakan menggunakan bahasa yang dipakai oleh manusia
Bahasa pemrograman didefinisikan dengan menentukan bentuk programnya (sintak) dan arti programnya (semantik) Memberikan fasilitas yang lebih banyak, seperti struktur kontrol program yang terstruktur, blok-blok serta prosedur dan fungsi-fungsi Tidak tergantung pada salah satu mesin Progam mudah untuk di koreksi (debug) Kontrol struktur seperti : kondisi (if .. Then.. Else ), perulangan (For,
Tingkatan Bahasa
Pemrograman
Sumber perancangan bahasa
Konstruksi yang diturunkan dari bahasa alami, karena bahasa alami dapat digunakan sebagai panduan untuk perancangan sintaks Matematika, misal untuk perancangan operasi aritmatika Bahasa pemrograman yang sudah ada. Tujuan perancangan bhs program Komunikasi dengan manusia Pencegahan dan deteksi kesalahan Usability Efektifitas pemrograman Compilability (mengurangi kompleksitas,mis:penggunaan bracket) Efisiensi dengan meminimalisir
Tujuan perancangan bhs program(2) Machine independent Simplicity :penyederhanaan komponen bahasa program Orthogonality : kumpulan primitive yang dikombinasikan dengan berbagai cara dalam membangun kontrol dan struktur data dalam bahasa programStruktur Ekspresi
Metode pengurutan evaluasi dalam ekspresi : Explicit Bracketing Operator binding
Binding adalah asosiasi antara atribut dan
entity atau antara operasi dan simbol.Binding time adalah waktu yang Struktur Data
Empat aspek dalam struktur data
Deklarasi data Tipe data yang tersedia Alokasi storage Lingkup variabelStruktur I/O
Format free
langsung ditampilkan sehingga mudah
bagi user untuk memeriksa kebenaran
program. Contoh pada VB.Formatted output ditampilkan secara terformat, seperti di C : printf(), delphi/VB : format()
ANDAIKAN....
Anda akan menciptakan sebuah bahasa program, coba sebutkan urutan proses yang harus ditentukan/skenario yang dijalani
1. Tentukan apa yang diinginkan. 2. Tentukan feature yang mungkin 3.
Tentukan desain dan sesuaikan dengan featurenya 4. Tentukan rincian, parsing, dan error checking. 5. Tuliskan user manual dan help. 6. Evaluasilah, jika salah mulai lagi dari langkah 3. 7. Jika sudah benar, optimisasilah dan uji segala kemungkinan.
SKENARIO PERANCANGAN
http://www.thefreecountry.com/developercity/compiler.html Free Compiler Construction Tools
Tools Bantu Compiler
Pada site tersebut juga tersedia informasi materi kuliah dengan LEX, YACC http:// suatu program ke byte code yang dapat dijalankan di Java Virtual Machine (JVM).TASSKAF. Bahasa TASSKAF ini merupakan subset dari Java. Dapat disusun
GENTLE. Gentle ini merupakan perangkat bantu (toolkit) modern untuk menulis
rw4.cs.uni-sb.de/~martin/COMP/TK/ matching, smart traversal dan lain sebagainya. Toolkit ini telah digunakan secara mendukung semua proses translasi, dari definisi tree sintaks abstrak, pater compiler dan mengimplemntasikannya pada bahasa tertentu. Perangkat bantu ini ELI. Merupakan suatu lingkungan pemrograman yang memungkinkan membuat
luas di riest dan industri .http://www.first.gmd.de/gentle/
ANTLR, ANother Tool for Language Recognition, is a language tool that provides a
grammatical descriptions containing actions in a varietframework for constructing recognizers, interpreters, compilers, and translators from
Made by : <almost by himself> Terrence Parr For 15 Years15 TH ?
IDE SISTEM PEMBELAJARAN
CERDAS a Surprise? What’s Skripsi with Top TopicKONSEP
dan NOTASI
BAHASAKonsep dan Notasi bahasa Konsep dan Notasi bahasa telah kita pelajari dalam teori bahasa dan automata
Teknik Kompilasi merupakan kelanjutan dari konsep-konsep yang
Thn 56-59 Noam chomsky melakukan penggolongan tingkatan dalam bahasa, yaitu menjadi 4 class 1959 Backus memperkenalkan notasi formal baru untuk syntax Penggolongan tingkatan itu disebut dengan hirarki Comsky Peter Nour (1960) merevisi metode dari syntax. Sekarang dikenal
bahasa yang lebih spesifikKonsep dan Notasi bahasa Konsep dan Notasi bahasa
Tata bahasa (grammar) adalah sekumpulan dari himpunan variabel-variabel, simbol-simbol terminal, simbol non-terminal, simbol awal yang dibatasi oleh aturan-aturan produksi
Aturan produksi adalah pusat dari tata bahasa
yang menspesifikasikan bagaimana suatu tata
Konsep dan Notasi bahasa Konsep dan Notasi bahasa
Syntax : suatu aturan yang memberitahu apakah sesuatu kalimat (string) adalah valid dalam program atau tidak Semantic : suatu aturan-aturan yang memberikan arti kepada program Review Mesin Automata Ada mesin penjual permen yang Misal : Misal : FSA Mesin tsb dpt menerima koin Harga Permen Rp.25 Memuat aturan2 sbb : Rp.25 (q) Rp.10 (d) Rp.5 (n), permen. $ = tombol utk mengeluarkan Terjadi diperlihatkan gambar : Kemungkinan2 yang
Review Mesin Automata
FSA State Diagram nya adalah : Misal : FSAContoh lain : FSA
Konsep dan Notasi bahasa Penggolongan Chomsky Bahasa Mesin Automata Aturan Produksi Atau meliputi; deterministic Tipe 3 Finite state automata (FSA) adalah simbol variabel Regular Finite Automata (DFA) & Non Deterministic Finite terletak diposisi paling kanan simbol variabel yang bila ada maksimal memiliki sebuah Atau Tipe 2 Push Down Automata Automata (NFA) adalah simbol variabel Contex Sensitive Tipe 1 Atau Linier Bounded Automata Contex Free || <= ||
Tipe 0 Mesin Turing Tidak ada Batasan
Keterangan menyatakan simbol – simbol yang berada di ruas kiri aturan produksi menyatakan simbol – simbol yang berada di ruas kanan aturan produksi Simbol-simbol terdiri dari simbol terminal dan
non terminal/variabel (masih bisa diturunkan
lagi) Simbol terminal biasanya dinyatakan denganAturan Produksi Tipe O / Unrestricted: Tidak Ada batasan pada aturan produksi Aturan Produksi Tipe 1 / Context sensitive: Panjang string ruas kiri harus lebih kecil atau sama Abc De dengan ruas kanan Ab DeF
Tipe 2 / Context free grammar: Ruas kiri haruslah tepat satu simbol variable
CD eF D BcDe B CDeFg dan diletakkan paling kanan sendiri Tipe 3 / Regular: Ruas kanan hanya memiliki maksimal 1 simbol non terminal
Aturan produksi yang tidak
legal !!! Simbol E tidak boleh berada pada ruas kiri misal E Abd Aturan produksi yang ruas kirinya hanya memuat simbol terminal saja misal : a bd atau ab bdHirarki Comsky
Regular
RegularContext free
Context Sensitive
Unrestricted
Contoh Tata Bahasa Contoh Tata Bahasa Sederhana Sederhana
<program> BEGIN <Statement-list> END <Statement-list> <statement> | <statement>; <statement-list> <statement> <var> := <expression> <Expression> <term> | <term><op1> <expression>
<term> <factor> | <factor> <op2> <term>
<factor> <var> | <constant> <var> A|B| ….| Z <op1> + | - | = <op2> ^ | * | / <constant> <real_number> | <integer_part>
<real_number> <integer_part> . <fraction>
Contoh
Contoh
Begin A := 1; B := A + 2 END
Diagram State Diagram State
Digunakan untuk mendapatkan token, mempermudah melakukan analisis lexical
Token adalah simbol terminal dari teori
Contoh : suatu tata bahasa memiliki himpunan simbol
token ID untuk karakter huruf a-z, 0-9, token INT untuk digit, token
terminal/token berikut (ID, PLUS, MINUS, dan INT) PLUS untuk Penjumlahan dan token MINUS untuk Pengurangan + PLUS hurufID Huruf, Digit S Digit MINUS INT
- -
Notasi BNF (Backus-Nour
Notasi BNF (Backus-Nour
Aturan Produksi bisa dinyatakan dengan notasi BNF Form) Form) BNF menggunakan abstraksi untuk struktur syntax ::= sama identik dengan simbol < > pengapit simbol non terminal | sama dengan atau Misalkan aturan produksi sbb: { } Pengulangan dari 0 sampai n kali T a E T | T+E | T-ENotasi BNFnya adalah E ::= <T> | <T> + <E> | <T> - <E>
Diagram Syntax Diagram Syntax Alat bantu (tools) dalam pembuatan parser/ analisis sintaksis Lingkaran untuk simbol terminal
Menggunakan simbol persegi panjang untuk non terminal
Misalnya E T | T+E | T-E E T- +
;
Kualitas dari Kualitas dari
Waktu yang dibutuhkan untuk kompilasi; tergantung dari
Compiler
Compiler
Algoritma compiler
Pembuat (compilator) Compiler itu sendiri
Kualitas dari obyek program yang dihasilkan Fasilitas-fasilitas Integrasi yang lainnya Ukuran yang dihasilkan
Struktur COMPILER Struktur COMPILER Source pr Source pr ogram ogram Lexical Analysis (scanner)
Syntax A (parser nalysis ) Intermediate code
Code Optimiza tion Code Generation
Keterangan
Lexical Analyzer = scanner, Syntax Analyzer, dan Intermediate Code
Keterangan mendekomposisi program sumber menjadi bagian-bagian kecil merupakan fungsi Analisis dalam compiler, yang bertugas synthesis yang berfungsi melakukan pembangkitan / pembuatan dan
Code generation dan Code optimization adalah merupakan fungsi Scanner adalah mengelompok-an program asal/sumber menjadi token
optimasi program (object program) Parser (mengurai) bertugas memeriksa kebenaran dan urutan dari token-Lexical Analysis (scanner) - Lexical Analysis (scanner) -
berhubungan dengan bahasa
Mengidentifikasikan semua besaran yang membuat suatu bahasaberhubungan dengan bahasa
Mentransformasikan ke token-token Menentukan jenis dari token-token Menangani tabel simbol Menangani kesalahan Token : separates characters of the source language into group that logically
Scanner, didesign untuk mengenali - keyword, operator, identifierbelong together
Lexical Analysis ( Besaran Lexical Analysis ( Besaran
Identifier dapat berupa keyword atau nama kunci, seperti
leksikal ) leksikal ) INT, FLOAT (Bhs C) IF..ELSE, BEGIN..END (pada Pascal), INTEGER (pascal), bilangan pecahan (float/Real), boolean (true/false), Konstanta : Besaran yang berupa bilangan bulat (integer), Operator; Operator arithmatika ( + - * / ), operator logika ( < karakter, string dan sebagainya Delimiter; Berguna sebagai pemisah/pembatas, seperti = > ) white-space kurung-buka, kurung -tutup, titik, koma, titik-dua, titik-koma, seperti enter, spasi, ganti baris, akhir file White Space: pemisah yang diabaikan oleh program,
Lexical Analysis - Contoh Contoh 1: Lexical Analysis - Contoh fahrenheit := 32 + celcius * 1.8, ada urutan karakter yang disebut dengan statement identifier fahrenheit Maka akan diterjemahkan kedalam token-token seperti dibawah ini integer operator := 32 Identifier celcius operator penjumlahan +
Lexical Analysis - Contoh 2 Lexical Analysis - Contoh 2 bentuk internal, dan angkanya adalah unik
Setiap bentuk dari token di representasi sebagai angka dalam
Misalnya nilai 1 untuk variabel, 2 untuk konstanta, 3 untuk label dan 4 untuk operator, dst Contoh instruksi : Kondisi : IF A > B THEN C = D; Maka scanner akan mentransformasikan kedalam token-token, Lexical Analysis - Contoh 2 Kondisi 3 : 26 IF 20 A 1 > 15 B THEN 1 C 21 D 1 ; 1 27 Token-token ini sebagai inputan untuk syntax Analyser , token-token ini bisa berbentuk pasangan item. Dimana Item pertama menunjukkan alamat atau lokasi dari token pada tabel simbol. Item kedua adalah representasi
Syntax Analyzer Pengelompokan token-token kedalam class syntax (bentuk Syntax Analyzer syntax), seperti procedure, Statement dan expression
mendefinisikan bahasa sumber Grammar : sekumpulan aturan-aturan, untuk Grammar dipakai oleh syntax analyser untuk menentukan struktur dari program sumber
Syntax Analyzer Syntax Analyzer Maka Syntax analyser sering disebut dengan parser
Pohon sintaks yang dihasilkan digunakan untuk semantics analyser yang bertugas untuk menentukan ‘maksud’ dari program sumber.
Misalnya operator penjumlahan maka semantics
Contoh Contoh Terdapat statement : ( A + B ) * ( C + D ) <factor>, <term> & <expression>
Akan menghasilkan bentuk sintaksis:
Syntax tree Syntax tree tree/ parse tree) beguna untuk Pohon sintaks/ Pohon penurunan (syntax suatu string dengan cara menurunkan menggambarkan bagaimana memperoleh simbol terminal. simbol-simbol variable menjadi simbol-
B bB | B A aA | a Misalnya: S AB
Parsing atau Proses Parsing atau Proses
Penurunan Penurunan Parsing dapat dilakukan dengan cara : Penurunan terkiri (leftmost derivation) : simbol variable yang paling kiri diturunkan (tuntas) dahulu Penurunan terkanan (rightmost derivation): variable yang paling kanan diturunkan (tuntas) dahulu Misalkan terdapat ingin dihasilkan string aabbaa dari A SbA | ba context free language: S a AS | a,
Parsing atau Proses Parsing atau Proses Penurunan Penurunan
S => a A S => a SbA S => a abA S => a aabba S Penurunan kanan : S => aA S => aA a => a SbA a => a Sbba a
Parsing Parsing Misalnya: S -> aB | bA B -> b | bS | aBB A -> a | aS |bAA
Metode Parsing Perlu memperhatikan 3 hal: Metode Parsing Penanganan Kesalahan Waktu Eksekusi Penanganan Kode Parsing digolongkan menjadi: Top-Down metode ini meliputi: Penelusuran dari root ke leaf atau dari simbol awal ke simbol terminal No backtrack : Recursive Descent Parser Backtrack/backup : Brute Force
Parsing: Brute force Parsing: Brute force Meng-expand simbol non terminal sampai pada simbol terminal Memilih aturan produksi mulai dari kiri Algoritma ini membuat pohon parsing secara top-down, yaitu dengan cara mencoba Bila terjadi kesalahan (string tidak sesuai) maka dilakukan backtrack Contoh suatu language dengan aturan produksi sebagai berikut segala kemungkinan untuk setiap simbol non-terminal A b | c S aAd | aB
Parsing: Brute force Parsing: Brute force (i) S (ii) S (iii) S a A d a A d b Terjadi kegagalan (iii), dilakukan back track (iv) S (v) S (vi) S aA d a B a B Terjadi kegagalan lagi (iv), dilakukan back-track c c c d
Parsing: Brute force Parsing: Brute force Kelemahan dari metode-metode brute-force Mencoba untuk semua aturan produksi yang ada sehingga menjadi lambat Mengalami kesukaran untuk melakukan pembetulan kesalahan (waktu eksekusi) backtrack Memakan banyak memakan memori, dikarenakan membuat backup lokasi Grammar yang memiliki Rekursif Kiri tidak bisa diperiksa, sehingga harus
Brute force : Contoh Terdapat grammar/tata bahasa G = (V,T,P,S), dimana Brute force : Contoh T= (“i”,”*”,”/” ,”+”,”-”) Simbol Terminal V= (“E”,”T”,”F”) Simbol NonTerminal (variable) String yang diinginkan adalah i * i S=”E” Simbol Awal / Start simbol 1. E T | T + E | T - E aturan produksi (P) yang dicobakan adalah F i T F | F * T | F / T
Brute force : Contoh Brute force : Contoh T F | T* F | T / F
2. E T | E+T | E-T accept (diterima) F i Meskipun ada rekursif kiri, tetapi tidak diletakkan sebagai aturan yang paling kiri T T* F | T / F | F
Brute force : Aturan Brute force : Aturan produksi produksi
Aturan Produksi yang rekursif memiliki ruas kanan (hasil produksi) yang memuat
simbol variabel pada ruas kiri Sebuah produksi dalam bentuk A A merupakan produksi rekursif kanan contoh: S d S = berupa kumpulan simbol variabel dan terminal bentuk produksi yang rekursif kiri B ad B contoh: A A merupakan produksi rekursif Kiri B B ad S S dAturan produksi : Brute Aturan produksi : Brute force force Produksi yang rekursif kanan akan menyebabkan penurunan menyebabkan penurunan tumbuh ke kiri. tumbuh kekanan, Sedangkan produksi yang rekursif kiri akan sebagai berikut:
Contoh: Context free Grammar dengan aturan produksi
Aturan produksi : Brute force
Aturan produksi : Brute force
Dalam Banyak penerapan tata-bahasa, rekursif kiri tidak diinginkan, Untuk menghindari penurunan kiri yang looping, perlu dihilangkan sifat rekursif, dengan langkah-langkah sebagai berikut: Aturan produksi yang rekursif kiri
Pisahkan Aturan produksi yang rekursif kiri dan yang tidak; misalnya
A A 1 | A 2 | ... | A n
Aturan produksi : Brute force
Aturan produksi : Brute force
berikut: lakukan per-ganti-an aturan produksi yang rekursif kiri, sebagai 2 Z 1 | 2 | ... | n
1. A 1 Z | 2 Z | ... | n Z
3 Z 1 Z | 2 Z | ... | n Z
Aturan produksi : Brute Pergantian dilakukan untuk setiap aturan produksi dengan simbol ruas kiri yang sama, bisa muncul Aturan produksi : Brute force force variabel Z1, Z2 dst, sesuai dengan variabel yang menghasilkan rekurisif kiri
Contoh: Tata Bahasa Context free S Sab | aSc | dd | ff | Sbd S Sab | Sbd Pisahkan aturan produksi yang rekursif kiri Aturan Produksi yang tidak rekursif kiri Ruas Kiri untuk S: 1=ab , 2=bd dari situ didapat untuk Ruas Kiri untuk S: 1 = aSc, 2 = dd, 3= ff S aSc | dd | ff
Aturan produksi : Brute Aturan produksi : Brute force force S Sab | Sbd, dapat digantikan dengan Langkah berikutnya adalah penggantian yang rekursif kiri
1. S aScZ1 | ddZ1 | ffZ1 2. Z1 ab | bd 3. Z1 abZ1 | bdZ1
Berikut: Hasil akhir yang didapat setelah menghilangkan rekursif kiri adalah sebagai S aScZ1 | ddZ1 | ffZ1 S aSc | dd | ff
Z1 ab | bd
Aturan produksi : Kalau pun tidak mungkin menghilangkan rekursif kiri dalam penyusunan aturan Aturan produksi : Brute force produksi maka produksi rekursif kiri diletakkan pada bagian belakang atau Brute force terkanan, hal ini untuk menghindari looping pada awal proses parsing
sehingga butuh waktu yang cukup lama serta memerlukan memori yang besar Metode ini jarang digunakan, karena semua kemungkinan harus ditelusuri, untuk penyimpanan stack (backup lokasi backtrack)
Metode ini digunakan untuk aturan produksi yang memiliki alternatif yang sedikit
Parsing: Recursive Parsing: Recursive Descent Parser Descent Parser
Parsing dengan Recursive Descent Parser Salah satu cara untuk meng-aplikasikan bahasa context free Simbol terminal maupun simbol variabelnya sudah bukan sebuah karakter
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
Aturan Produksi memakai Recursif Descent : 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 Contoh : <program> ::= t_PROG t_ID t_SEMICOL <block> t_DOT Grammar dengan BNF : <statement> ::= t_ID t_ASS <simple exp> | <block> ::= t_BEGIN <statement> {t_SEMICOL <statement>} t_END
t_IF <exp> t_THEN <statement> t_ELSE <statement>
t_IF <exp> t_THEN <statement>| <simple_exp> t_LT <simple_exp>| <exp> ::= <simple_exp> t_EQ <simple exp> | Dst……. <simple_exp> t_GT <simple_exp>
Penggalan program untuk
grammar tsbSemantics Analyser Semantics Analyser sebelumnya, yaitu analisa leksikal (scanning) dan analisa sintaks
Proses ini merupakan proses kelanjutan dari proses kompilasi
Bagian terakhir dari tahapan analisis adalah analisis semantik
(parsing) Proses analisa sintak dan analisa semantik merupakan dua Memanfaatkan pohon sintaks yang dihasilkan dari parsingproses yang sangat erat kaitannya, dan sulit untuk dipisahkan
Semantics Analyser Semantics Analyser
Contoh : A := ( A+B) * (C+D) Parser hanya akan mengenali simbol-simbol ‘:=‘, ‘+’,
dan ‘*’, parser tidak mengetahui makna dari simbol-
simbol tersebut Untuk mengenali makna dari simbol-simbol tersebut, Compiler memanggil routin semantics
Semantics Analyser Semantics Analyser Untuk mengetahui makna, maka routin ini akan memeriksa: Apakah variabel yang ada telah didefinisikan sebelumnya Apakah variabel-variabel tersebut tipenya sama Apakah operand yang akan dioperasikan tersebut ada nilainya,
dan seterusnya Menggunakan tabel simbol Pemeriksaan bisa dilakukan pada tabel identifier, tabel display,
Semantics Analyser
Semantics Analyser
Pengecekan yang dilakukan dapat berupa: Memeriksa penggunaan nama-nama (keberlakuannya) Duplikasi Apakah sebuah nama terjadi pendefinisian lebih dari dua kali. Pengecekan dilakukan pada bagian pengelolaan block Terdefinisi Apakah nama yang dipakai pada program sudah terdefinisi atau belum. Pengecekan dilakukan pada semua tempat kecuali block
Memeriksa tipe
Semantics Analyser
Semantics Analyser
Contohnya; expresi yang mengikut IF berarti tipenya boolean, akan diperiksa tipe identifier dan tipe ekspresinya Bila ada operasi antara dua operand maka tipe operand pertama harus bisa dioperasikan dengan operand yang kedua
Analisa Semantic sering juga digabungkan dengan intermediate code yang akan menghasilkan output intermediate code.
Intermediate Code Memperkecil usaha dalam membuat compilator dari sejumlah bahasa ke Intermediate Code
Lebih Machine Independent, hasil dari intermediate code dapat digunakan lagi
sejumlah mesin Proses Optimasi lebih mudah. Lebih mudah dilakukan pada intermediate code
pada mesin lainnya mesin dari pada program sumber (source program) atau pada kode assembly dan kode mesin Intermediate code ini lebih mudah dipahami dari pada kode assembly atau kode Kerugiannya adalah melakukan 2 kali transisi, maka dibutuhkan waktu yangIntermediate Code Intermediate Code
Ada dua macam intermediate code yaitu Notasi Postfix dan N-Tuple <Operand> <Operand> < Operator> Notasi POSTFIX Misalnya : ( a +b ) * ( c+d ) maka Notasi postfixnya ab+ cd+ *
Semua instruksi kontrol program yang ada diubah menjadi notasi postfix, misalnya
Diubah ke postfix menjadi ; <expr> <label1> BZ <stmt1> <label2> BR < stmt2> BR: melompat tanpa harus ada kondisi yang ditest BZ : Branch if zero (salah)
Contoh : IF a > b THEN c := d ELSE c := e Contoh : IF a > b THEN c := d ELSE c := e Dalam bentuk Postfix 11 a 19 13 > 21 BR 12 b 20 25 15 BZ 23 e 14 22 22 c 17 d 25 16 c 24 :=
POSTFIX Contoh: WHILE <expr> DO <stmt>
POSTFIX
Instruksi : a:= 1Diubah ke postfix menjadi ; <expr> <label1> BZ <stmt> <label2> BR
Dalam bentuk Postfix WHILE a < 5 DO a := a + 1 12 := 20 1 11 1 19 a 10 a 18 a 15 < 23 13 14 5 22 := 13 a 21 + 17 BZ 25 16 25 24 BRNotasi pada triple dengan format TRIPLES NOTATION Contoh: <operator> <operand> <operand> Jika dibuat intermidiate code triple: A := D * C + B / E 2. /, B, E 1. * , D, C 4. :=, A, (3) 3. +, (1), (2) pengurangan pembagian mendapatkan prioritas lebih dahulu dari oada penjumlahan dan Perlu diperhatikan presedensi (hirarki) dari operator, operator perkalian dan
TRIPLES NOTATION
Contoh lain:TRIPLES NOTATION
IF X > Y THEN X := a + b ELSE X := a - b Intermidiate code triple: 1. >, X, Y 3. -, a, b