-
1
Pendahuluan Teknik Kompilasi merupakan mata kuliah yang khusus
ditujukan kepada mahasiswa jurusan Teknik Informatika dan Ilmu
Komputer. Adapun sejumlah sasaran dari mempelajari mata kuliah
Teknik Kompilasi ini diantaranya adalah : 1. Mahasiswa diharapkan
mampu memahami prinsip kerja yang mendasar dari suatu
kompiler.
2. Mengetahui tahapan tahapan dari suatu proses kompilasi. 3.
Mahasiswa juga diharapkan mempunyai bekal mendasar untuk
mengembangkan
ilmu pengetahuan yang dimilikinya ke tingkat yang lebih
lanjut.
Bahasa Pemrograman Manusia dapat melakukan interaksi secara
efektif dengan menggunakan media bahasa. Bahasa memungkinkan
penyampaian gagasan dan pemikiran, tanpa itu komunikasi akan sulit
terjadi. Dalam lingkungan pemrograman komputer, bahasa pemrograman
bertindak sebagai sarana komunikasi antara manusia dan
permasalahannya dengan komputer yang dipakai untuk membantu
memperoleh
pemecahan.
Bahasa pemrograman berdasarkan tingkat ketergantungannya dengan
mesin bisa meliputi:
1. Bahasa Mesin
Merupakan bentuk terendah dari bahasa komputer. Setiap instruksi
dalam program
direpresentasikan dengan kode numerik, yang secara fisik berupa
deretan angka 0 dan 1.
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). Pada bahasa assembly tersedia
alat bantu untuk diagnostik atau debug yang tidak terdapat pada
bahasa mesin. Contoh produk yang ada untuk pengembangan dan debug
bahasa assembly di pasaran saat ini, misalnya Turbo Assembler dari
Borland, Macro Assembler dari Microsoft, Debug yang tersedia pada
DOS, dan lain lain.
-
2
3. Bahasa tingkat tinggi (User Oriented) Disebut tingkat tinggi
karena lebih dekat dengan manusia. Memberikan fasilitas
yang lebih banyak, kontrol program yang terstruktur, kalang
(nested), block, dan prosedur. Contohnya : Pascal, C, Basic, dan
lain lain.
4. Bahasa yang Problem Oriented Memungkinkan penyelesaian untuk
suatu masalah atau aplikasi yang spesifik.
Contohnya : SQL (Structured Query Language) untuk aplikasi
database, COGO untuk aplikasi teknik sipil. Bahasa yang problem
oriented kadang dimasukkan pula sebagai bahasa tingkat tinggi.
Keuntungan bahasa tingkat tinggi dibandingkan bahasa tingkat
rendah adalah sebagai berikut. 1. Kemudahan untuk dipelajari. 2.
Lebih mendekati permasalahan yang akan diselesaikan.
3. Pemrogram tidak perlu mengetahui bagaimana representasi data
ke dalam bentuk internal di memory.
4. Memberikan banyak pilihan struktur kontrol seperti :
Kondisional (IF THEN ELSE) Looping
Struktur Blok (Begin ... End) Nested Statement
5. kompabilitas dan dokumentasi yang lebih baik dalam
pengembangan program.
Translator
Sebuah translator melakukan pengubahan source code / source
program (program sumber) ke dalam target code / object code /
object program (program objek). Source code ditulis dalam bahasa
sumber, sedang object code bisa berupa suatu bahasa pemrograman
lain atau bahasa mesin pada suatu komputer. Ada beberapa macam
translator. 1. Assembler
Menerjemahkan langsung dari source code ke object code. Source
Code adalah bahasa assembly sedangkan object code adalah bahasa
mesin. Contohnya adalah TASM.
-
3
Contoh yang menghasil .Com adalah : Debug, TASM (bila linker
dilakukan dengan perintah Tlink/x/t), emu8086, Contoh yang
menghasilkan .Exe adalah : TASM dengan perintah linker Tlink, HLA,
MASM32, FASM
Khusus TASM terkadang file .Com yang dihasilkan akan lebih baik
daripada file .Exe yang dihasilkan sebagai contoh adalah pada
program berikut : .Model Small
.Code
Org 100h
Main :
Jmp Mulai
Pesan db 'Selamat Datang!','$' Mulai :
Mov Ah,09H
Mov dx,offset pesan
int 21h
mov ah,4ch
int 21h
end Main
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, C++.
3. Interpreter Interpreter tidak membangkitkan Object Code,
hasil translasi hanya dalam bentuk Run Time Code. Contohnya :
Bahasa Basica, Dbase/Foxbase
File.ASM Assembler File .Exe
atau .Com
Source File
Compiler Object Code
File Executable
-
4
Perbedaan antara Interpreter dengan Compile Interpreter
1. Menerjemahkan instruksi per instruksi 2. Tidak menghasilkan
objek program 3. Tidak menghasilkan executable program
4. Source program terus dipergunakan karena tidak dihasilkan
executable program.
Compiler 1. Menerjemahkan secara keseluruhan sekaligus 2.
Dihasilkan objek program 3. Dihasilkan executable program
4. Source program tidak dipergunakan lagi untuk menjalankan
program.
Model Kompilator Pengembangan kompilator untuk sebuah bahasa
merupakan pekerjaan yang kompleks. Kompleksitas kompilator bisa
dikurangi bila perancang bahasa pemrograman mempertimbangkan
bermacam macam faktor perancangan. Karena
kita berhubungan dengan bahasa tingkat tinggi, bagaimanapun
suatu model dasar dari kompilator dapat diformulasikan.
Sebuah kompilator umumnya memiliki 2 tugas pokok : 1. Fungsi
Analisis
Fungsi analisis biasa disebut sebagai Front End. Tugasnya
melakukan dekomposisi program sumber menjadi bagian bagian
dasarnya.
2. Fungsi Sintesis
Fungsi sintesis biasa disebut sebagai Back End. Tugasnya
melakukan pembangkitan dan optimasi program objek.
Source Code
Interpreter Run Time Code
-
5
Model sebuah kompilator bisa dilihat pada gambar di bawah
ini.
Keterangan gambar : Scanner : memecah program sumber menjadi
besaran leksikalnya.
Beberapa kegiatan pada tahap scanner ini diantaranya adalah
:
- Menangani kesalahan
Contohnya : A = +B 1
- Membuang Blank Contohnya : A = B + 1
- Mengenali besaran leksikal Contohnya di sini adalah mengenali
apakah huruf atau angka
- Dan lain lain
Parser : Memeriksa kebenaran dan urutan kemunculan token
Seperti : - Samping kiri = pasti variabel - Samping kanan =
pasti ekspresi - Tiap operator +, -, *, /, tidak boleh double.
Contohnya : A = 3++7
Source Code
Lexical Analyzer (Scanner)
Syntetic Analyzer (Parser)
Code Optimizer
Sematic Analyzer
Intermediate Code
Generator
Object Code
Intermediate Code
Code Generator
Tabel Informasi
Analysis Synthesis
-
6
Analisis semantik : Melakukan analisa semantik, biasanya dalam
realisasi akan digabungkan dengan intermediate code generator
(bagian yang berfungsi membangkitkan kode antara. Seperti :
- Triples Notation - Quadruples Notation
Code Generator : Membangkitkan kode objek. Bagian ini merupakan
bagian yang bersifat abstrak, artinya tidak dilaksanakan oleh
programmer. Tetapi dilakukan
oleh bahasa pemrograman yang dilakukan oleh programmer dalam
perancangan compiler. Di sini kode antara dari program biasanya
ditranslasi ke bahasa assembly atau bahasa mesin.
Code Optimizer : Upaya untuk memperkecil hasil dan mempercepat
proses Tabel Informasi : Menyimpan semua informasi yang berhubungan
dengan proses
kompilasi.
Pada beberapa kompilator, bagaimanapun, fase fase kompilasi
tersebut bisa
dikombinasikan. Bisa kita lihat, misalnya interaksi antara
scanner dan parser terdapat dua kemungkinan : 1. Scanner
menghasilkan suatu token untuk diproses oleh parser. Parser
akan
memanggil scanner bila token berikutnya diperlukan.
2. Scanner menghasilkan semua token yang berhubungan dengan
source program sebelum memneruskan ke parser. Pada kasus ini
scanner telah memeriksa
keseluruhan source program.
Mutu Kompilator Misalkan saja kita pernah menggunakan kompilator
untuk bahasa Basic seperti Turbo Basic dan Quick Basic. Kemudian
kita bisa mengatakan bahwa salah satu lebih baik dari lainnya.
Tentu ada beberapa hal yang menjadi pertimbangan kita, dalam hal
ini bisa kita sebut sebagai mutu dari kompilator yang bersangkutan.
Mutu sebuah kompilator bergantung dari beberapa faktor, yaitu : 1.
Kecepatan dan waktu proses kompilasi.
Bisa Anda bayangkan misalkan saat Anda menekan F9 (Compile)
dalam kompilator Turbo Pascal untuk melakukan kompilasi suatu
program. Berapa lama
-
7
Anda harus menunggu untuk memperoleh hasil kompilasi itu
merupakan waktu proses kompilasi.
Mutu ini tergantung dari : Penulisan algoritma kompilator :
yaitu algoritma yang digunakan untuk
menuliskan program kompilator tersebut. Misalkan saja bisa
dikatakan bahwa suatu kompilator lebih cepat melakukan kompilasi
dibandingkan lainnya, karena para pemrogramnya menggunakan
algoritma yang lebih baik saat
membuat kompilator tersebut. Kompilator pengkompilasi : sebuah
program khusus yang menghasilkan
kompilator tersebut. Bisa kita bayangkan kompilator Turbo Basic,
misalnya, tentu saja tidak dibuat dengan bahasa Basic, tetapi
menggunakan bahasa lain dan dikompilasi.dengan kompilator lain.
Kalau sebuah kompilator dibuat dengan bahasa C, misalnya ,
kompilator C tersebut juga ikut menentukan mutu kompilator yang
dibuat.
2. Mutu Program Objek Mutu suatu program objek (program hasil
dari proses kompilasi) ditentukan oleh ukuran dan kecepatan
eksekusi dari program objek. Misalkan saja kita bisa mengatakan
bahwa Turbo Pascal 6 lebih baik dari Turbo Pascal 5, bila program
Objek (EXE) yang dihasilkan berukuran lebih kecil dan lebih cepat
dieksekusi. Hal ini tergantung dari fungsi translasi yang digunakan
oleh kompilator tersebut
(cara untuk melakukan perubahan dari source code ke object
code). Misalkan saja kita akan membuat suatu kompilator yang
memiliki instruksi untuk menuliskan suatu kalimat ke layar, kita
sebut saja instruksi writekar. Kompilator ini kita buat dengan
bahasa assembly. Sementara pada assembly untuk melakukan pencetakan
kalimat bisa dengan Intterupt 10 atau Intterupt 21. Maka pilihan
apakah instruksi
Source Program Kompilator A
dalam Bahasa K
Kompilator Pengkompilasi
(K)
Kompilator Bahasa A
-
8
writekar tadi akan diubah ke intterupt 10 atau intterupt 21,
akan ikut menentukan ukuran object code nya .
3. Integrated Environtment Merupakan fasilitas fasilitas
terintegrasi yang dimiliki oleh kompilator tersebut. Misalnya untuk
melakukan editing, debugging, testing. Biasa disebut juga dengan
IDE (Integrated Development Environtment). Misalkan saja dengan
Turbo Pascal (Turbo.Exe) Anda bisa melakukan penyuntingan sekaligus
kompilasi dan debug dalam satu lingkungan pemrograman. Sementara
kalau menggunakan Clipper (Clipper.Exe) Anda harus melakukan
penyuntingan dengan menggunakan suatu program editor (PE.Exe)
ataupun notepad yang terpisah dari kompilatornya.
Pembuatan Kompilator Pembuatan suatu kompilator dapat dilakukan
dengan :
1. Bahasa Mesin
Tingkat kesulitannya sangat tinggi, karena bahasa mesin ini
sangat dekat dengan
mesin sehingga sangat tidak manusiawi, dan tingkat
ketergantungannya pada mesin yang tinggi. Pembuatan kompilator
dengan bahasa mesin hampir mustahil dilakukan. Bahasa mesin mungkin
digunakan saat membuat assembler.
2. Bahasa Assembly Bahasa assembly bisa dan biasa digunakan
sebagai tahap awal pada proses pembuatan sebuah kompilator.
Keuntungan penggunaan bahasa assembly adalah program hasil (object
code) yang memiliki ukuran kecil. Kerugiannya memerlukan usaha yang
besar, karena instruksi assembly pendek pendek (sulit dimengerti)
dan memiliki fasilitas yang terbatas. Sehingga masih terdapat
kesulitan untuk mengembangkan sebuah kompilator yang secara
keseluruhan
dibuat dengan bahasa assembly. 3. Bahasa tingkat tinggi
Keuntungannya adalah proses pembuatan kompilator akan lebih
mudah, karena menggunakan bahasa tingkat tinggi yang lebih mudah
dimengerti dan fasilitasnya lebih baik dibandingkan assembly.
Kerugiannya kompilator yang dihasilkan akan memiliki ukuran yang
besar. Bisa dibayangkan kalau kita akan mengembangkan suatu
kompilator untuk suatu bahasa dengan menggunakan Turbo Pascal.
-
9
4. Bootstrap
Gagasan dari Bootstrap adalah kita bisa membangun sesuatu yang
besar dengan
lebih dulu membuat bagian intinya. Cara ini diperkenalkan oleh
Niklaus Wirth saat membuat kompilator untuk bahasa Pascal.
Pada gambar di atas, P0 dibangun dengan assembly, P1 dibangun
dengan P0, P2 dibangun dengan P1. Jadi kompilator untuk bahasa P
bisa dibuat tanpa harus secara keseluruhan menggunakan
assembly.
Soal : 1. Mengapa kita memerlukan bahasa pemrograman ?
2. Berikan penjelasan dari istilah istilah berikut : a.
Kompilator
b. Translator c. Interpreter
d. Assembler e. Emulator
3. Berikan beberapa contoh produk yang ada dipasaran untuk
setiap istilah pada nomor 2.
4. Apa keuntungan dari penggunaan metode Bootsrap.
Jawab : 1. Alasan pentingnya bahasa pemrograman : Bahasa
pemrograman digunakan
sebagai alat untuk berkomunikasi dengan komputer untuk
menjalankan suatu instruksi (program) tertentu, sehingga melalui
bahasa pemrograman dapat dihasilkan suatu sistem yang sederhana
hingga sistem yang kompleks.
2. Artinya adalah :
P0
P1 P2
-
10
a. Kompilator adalah suatu bahasa tingkat tinggi untuk
menerjemahkan dari suatu source code untuk menjadi object code,
untuk kemudian menghasilkan suatu executable program.
b. Interpreter adalah suatu bahasa tingkat tinggi untuk
menerjemahkan dari suatu source code menjadi run time code.
c. Translator adalah Suatu bahasa tingkat tinggi untuk
menerjemahkan dari suatu source code manjadi bahasa mesin.
d. Assembler adalah suatu bahasa untuk menerjemahkan dari suatu
sintaks assembly menjadi bahasa mesin.
e. Emulator adalah suatu bahasa pemrograman yang dirancang untuk
menyerupai cara kerja dari suatu bahasa yang lain.
3. Contoh kompilator adalah :Bahasa Pascal, C++. Contoh
Interpreter adalah : Bahasa Basica, Dbase / Foxbase Contoh
Translator adalah : Bahasa Pascal, C++, Bahasa Basica
Contoh Assembler adalah : TASM, MASM, NASM, FASM Contoh Emulator
: emu8086
4. Jika program inti sudah dirancang dengan baik, maka
pengembangan akan lebih cepat dilakukan.
Sumber Perancangan Bahasa Pemrograman Gagasan untuk perancangan
bahasa pemrograman bisa berasal dari bahasa alami (natural
language), matematika, dan bahasa pemrograman yang sudah ada.
Penjelasannya masing masing sebagai berikut. 1. Konstruksi yang
diturunkan dari bahasa alami berguna untuk kejelasan dan
kemudahan pembacaan. Sebuah instruksi akan mengerjakan mirip
dengan arti instruksi itu. Hal ini memberikan kenyamanan untuk para
pemrogram, khususnya
yang belum berpengalaman. Di sisi lain bisa pula menimbulkan
ambiguitas / ke dwi artian- yang tidak diinginkan dalam sebuah
bahasa pemrograman.
Bagaimanapun, bahasa alami bisa digunakan sebagai panduan untuk
perancangan sintaks sebuah bahasa pemrograman.
2. Matematika telah banyak dipakai untuk aturan aturan yang
terdapat pada bahasa pemrograman, misalnya ekspresi aritmatika.
Tetapi, seseorang pemrogram dan ahli matematika menggunakan metode
dan memecahkan masalah yang berbeda.
-
11
Meskipun matematika merupakan suatu sumber yang berguna, perlu
kehati hatian saat mengadopsi notasi matematika untuk suatu
konsep.
3. Bahasa pemrograman yang sudah ada bisa menjadi sumber yang
bagus untuk perancangan bahasa pemrograman. Tetapi perlu ketelitian
saat menggunakannya, karena bahasa yang sudah ada itu mungkin
mengandung kesalahan yang serius. Beberapa fasilitas yang
diinginkan bisa dibatasi untuk meningkatkan kemudahan
baca (readability) dan pemeriksaaan kesalahan, dengan mengamati
bagian mana dari bahasa yang jarang digunakan. Misalnya motivasi
untuk tidak menggunakan instruksi GOTO datang dari pengamatan bahwa
pemrogram yang baik tidak menggunakan GOTO untuk membuat struktur
yang lebih mudah dipahami.
Pertimbangan dalam Perancangan Bahasa Pemrograman Adapun
pertimbangan pertimbangan yang perlu dalam perancangan sebuah
bahasa pemrograman adalah sebagai berikut.
1. Komunikasi dengan manusia Jika sebuah program sulit
dimengerti oleh manusia, akan terjadi kesulitan juga untuk
memeriksa dan melakukan pemeliharaan / modifikasi. Masalah ini
tidak bisa dipecahkan dengan sekedar menambahkan komentar atau
melalui dokumentasi tersendiri. Pemrogram tidak suka menambahkan
komentar yang berlebihan, sementara dokumentasi program sering
tidak lengkap. Sintaks sebuah
bahasa pemrograman harus merefleksikan semantiknya. Keterbatasan
kemampuan pikir menyulitkan untuk memahami suatu struktur yang
kompleks, sementara
kompilator tidak. Mungkin suatu statement bermakna ambigu bagi
manusia, sementara sudah cukup jelas bagi kompilator, misalkan
instruksi aritmatika berikut : A / b / c
Bisa berarti a dibagi dengan b, baru hasilnya dibagi dengan
c
Atau
a dibagi dengan hasil pembagian b dengan c 2. Pencegahan dan
deteksi kesalahan
Sebuah bahasa pemrograman yang baik perlu mengidentifikasikan
error yang mungkin terjadi. Sehingga mempermudah deteksi kesalahan
dan menghilankannya.
-
12
3. Usability Bahasa pemrograman harus mudah dipelajari dan
diingat. Sekali seorang pemrogram familiar dengan bahasa itu, dia
tidak harus melihat manual terus menerus. Usability berkaitan
dengan aspek kenyamanan seorang pemrogram menggunakan bahasa.
4. Efektifitas pemrograman
Efektifitas pemrograman berkaitan erat dengan kemudahan dalam
proses pembuatan program. Bahasa pemrograman yang case sensitive
akan mempunyai
tingkat efektifitas yang lebih rendah dibandingkan dengan bahasa
pemrograman yang non case sensitive
5. Compilability Pengembangan sebuah kompilator merupakan
pekerjaan yang tidak sederhana. Sebuah bahasa yang terlalu kompleks
akan menyulitkan pembuatan kompilator untuk bahasa tersebut.
Kompleksitas tersebut bisa muncul baik pada tahapan
analisis maupun sintaksis. Sebagai contoh yang sederhana adalah
penggunaan buka kurung dan tutup kurung, yang bisa digunakan untuk
banyak kegunaan.
1. Untuk membatasi argumen pada pemanggilan prosedur 2. Untuk
membatasi parameter pada definisi prosedur 3. Ekspresi logika 4.
dll
6. Efisiensi Efisiensi merupakan bahasan yang penting dalam
sejarah pengembangan bahasa pemrograman. Dalam hal ini perlu
diingat bahwa tidak seharusnya user dikorbankan dengan memaksa
mereka mengeluarkan uang untuk peningkatan perangkat keras.
7. Machine Independent
Sebuah bahasa dikatakan machine independent jika dan hanya jika
sebuah program yang telah sukses dikompilasi dan dieksekusi pada
suatu mesin, saat
dipindahkan ke mesin lainnya akan berjalan dengan input dan
output yang tepat sama
8. Kesederhanaan (simpiclicty) Suatu bahasa pemrograman harus
dirancang secara sederhana, seperti menyangkut pendeklarasian
variabel, pemakaian suatu fungsi, ataupun untuk mengakses suatu
-
13
properti pada suatu bahasa. Bahasa pemrograman visual basic
misalnya memiliki konsep keserhanaan dalam artian untuk
pendeklrasian variabel.
Detail Rancangan
Microstructure Microstructure pada dasarnya mencakup masalah
masalah dalam perancangan
bahasa yang mempengaruhi penampilan bahasa sehingga lebih mudah
dimengerti. Prinsip mendasar dari suatu microstructure adalah arti
dari suatu konstruksi, seperti
keyword, harus jelas dari wujudnya. Dengan kata lain, token
suatu bahasa harus mudah dikenali apakah itu dan apa yang
dilakukan.
Keyword harus bisa diucapkan, karena akan lebih mudah diingat.
Keyword harus dipilih sedemikian sehingga tidak akan sama dengan
identifier yang dibuat user. Misalkan saja gunakan operator SIZE
ketimbang SIZ. Jika mungkin jangan gunakan dua keyword yang
memiliki ejaan yang mirip (misal PROGEND dengan PROCEND). Terdapat
tiga pendekatan bagaimana memisahkan keyword dengan identifier yang
didefinisikan user : 1. Keyword adalah reserved dan tidak boleh
digunakan sebagai identifier
Merupakan alternatif terbaik karena sederhana dan jarang
menimbulkan masalah. 2. Keyword dibedakan dari identifier
berdasarkan konteksnya
Menyulitkan pada tahap parser, karena jumlah keyword pada
beberapa implementasi begitu besar sehingga user tidak dapat
menghindarinya.
3. Keyword diawali dengan karakter khusus untuk menandainya
Memerlukan tambahan pengetikan dan membuat program lebih susah
dibaca.
Aspek lain dari Microstructure adalah pengaturan komentar. Salah
satu pendekatan
dalam yang digunakan adalah dengan menggunakan suatu simbol
untuk menandai awal komentar dan kemudian apapun sampai akhir baris
dianggap sebagai komentar.
Pemilihan simbol yang mendahului komentar idealnya : 1. Simbol
terdiri dari dua karakter, lebih baik karakter yang sama 2. Simbol
yang jarang dipergunakan 3. Terdiri dari karakter berlokasi sama
pada keyboard Contohnya simbol // adalah pilihan yang baik untuk
menandai komentar.
-
14
Struktur Ekspresi Salah satu topik yang berhubungan dengan
ekspresi adalah urutan dari evaluasinya.
Seperti dalam operasi aritmatika memiliki urutan evaluasi : 1.
Operator ( dan operator ) 2. Operator * dan / 3. Operator + dan
-
Struktur Data Empat aspek dari struktur data adalah : 1.
Deklarasi Data
Biasanya kebutuhan bahasa pemrograman berkaitan dengan deklarasi
untuk : a. Konstanta
b. Tipe c. Variabel
2. Tipe Data
Terdapat tiga pendekatan untuk tipe data dalam bahasa
pemrograman :
a. Tidak ada sama sekali. Merupakan karakteristik yang ada pada
bahasa assembly
b. Soft Typing. Ditentukan suatu jenis tipe, di mana setiap
variabel boleh memuat nilai apapun.
c. Hard typing. Ditentukan suatu jenis tipe, di mana setiap
variabel hanya boleh memuat nilai yang menjadi domain dari tipe
tersebut. Dari sudut pandang pemeriksaan kesalahan saat kompilasi
hard typing lebih unggul.
Struktur Kontrol Sering dipakai dengan menggunakan If then else
dan juga perintah Case.
Struktur Kompilasi Struktur kompilasi mencakup aspek dari bahasa
yang berkaitan dengan proses kompilasi, berhubungan dengan operasi
pada bahasa yang dikerjakan saat kompilasi dan bagaimana kompilasi
modul yang berbeda dan terpisah dari program. Salah satu fasilitas
adalah untuk menyisipkan suatu file lain (seperti include pada
bahasa C ataupun uses pada bahasa Pascal).
-
15
Pendahuluan Teknik Kompilasi merupakan mata kuliah yang khusus
ditujukan kepada mahasiswa jurusan Teknik Informatika dan Ilmu
Komputer. Adapun sejumlah sasaran dari mempelajari mata kuliah
Teknik Kompilasi ini diantaranya adalah : 1. Mahasiswa diharapkan
mampu memahami prinsip kerja yang mendasar dari suatu
kompiler.
2. Mengetahui tahapan tahapan dari suatu proses kompilasi. 3.
Mahasiswa juga diharapkan mempunyai bekal mendasar untuk
mengembangkan
ilmu pengetahuan yang dimilikinya ke tingkat yang lebih
lanjut.
Bahasa Pemrograman Manusia dapat melakukan interaksi secara
efektif dengan menggunakan media
bahasa. Bahasa memungkinkan penyampaian gagasan dan pemikiran,
tanpa itu komunikasi akan sulit terjadi. Dalam lingkungan
pemrograman komputer, bahasa pemrograman bertindak sebagai sarana
komunikasi antara manusia dan permasalahannya dengan komputer yang
dipakai untuk membantu memperoleh pemecahan.
Bahasa pemrograman berdasarkan tingkat ketergantungannya dengan
mesin bisa meliputi:
1. Bahasa Mesin
Merupakan bentuk terendah dari bahasa komputer. Setiap instruksi
dalam program direpresentasikan dengan kode numerik, yang secara
fisik berupa deretan angka 0 dan 1.
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). Pada bahasa assembly tersedia
alat bantu untuk diagnostik atau debug yang tidak terdapat pada
bahasa mesin. Contoh produk yang ada untuk pengembangan dan debug
bahasa assembly di pasaran saat ini, misalnya Turbo Assembler dari
Borland, Macro Assembler dari Microsoft, Debug yang tersedia pada
DOS, dan lain lain.
-
16
Mengenali Huruf pada Suatu Input Pengenalan huruf ini penting
untuk mengetahui apakah suatu besaran leksik itu berupa identifier,
variabel ataupun konstanta. 1) Identifier atau Keyword
Terdiri dari deretan kata kunci pada suatu bahasa pemrograman
seperti : if, else, end if, then, for, while, dll
2) Konstanta Berupa angka tetap
3) Delimiter dan Operator Terdiri dari rangkaian operator, dalam
hal ini adalah operator aritmatika dan operator pembanding seperti
: +, -, , dll.
Berikut ini adalah program pada Bahasa Pemrograman Visual Basic
untuk mengenali
apakah suatu input itu huruf atau tidak. Private Sub Form_Load()
a = InputBox("Masukkan Input:") For i = 1 To Len(a) d = Mid(a, i,
1) If (d >= "A" And d = "a" And d = Asc("A") And Asc(d) =
Asc("a") And Asc(d)
-
17
End If
Next i
End Sub
Dengan menggunakan Bahasa Pascal : uses crt;
var
ekspresi : String;
tampung:char;
i:integer;
begin
clrscr;
write('Masukkan ekspresi:'); readln(ekspresi); for i:=1 to
length(ekspresi) do begin
if ((ekspresi[i]>=#65) and (ekspresi[i]=#97) and
(ekspresi[i]
-
18
if (isalpha(ekspresi[i])) printf("Adalah huruf\n"); else
printf("Bukan Huruf\n"); } getch(); }
Versi II : #include
#include
#include
void main() { clrscr(); char ekspresi[100]; int kar;
int i;
printf("Masukkan Ekspresi:"); scanf("%s",&ekspresi);
for(i=0;i=65) && (kar=97) && (kar= Asc("0") And
Asc(d)
-
19
Debug.Print "Bukan Angka"
End If
Next i
End Sub
Cara lain : Private Sub Form_Load() a = InputBox("Masukkan
Input:") For i = 1 To Len(a) d = Mid(a, i, 1) If (d >= "0" And d
=#48) and (ekspresi[i]
-
20
Dengan menggunakan Bahasa C : #include
#include
#include
#include
void main() { clrscr(); char ekspresi[100]; int i;
printf("Masukkan Ekspresi:"); scanf("%s",&ekspresi);
for(i=0;i
-
21
printf("Bukan Angka\n"); } getch(); }
Analisis Leksikal Tugas utama penganalisis leksikal / Scanner
adalah mengidentifikasi semua besaran yang membangun suatu bahasa
pada program sumber. Scanner adalah bagian dari kompilator yang
menerima input berupa stream karakter kemudian memilah program
sumber menjadi satuan leksik yang disebut dengan token. Token
ini akan menjadi input bagi parser.
Pekerjaan yang dikerjakannya antara lain : 1. Melakukan
pembacaan kode sumber dengan merunut karakter demi karakter. 2.
Mengenali besaran leksik. 3. Membuang komentar : Komentar biasanya
ditulis oleh programmer untuk
mempermudah dalam mempelajari program yang dibuat. Dalam setiap
bahasa pemrograman selalu disediakan simbol untuk mengawali /
mengakhiri komentar.
Oleh karena itu scanner pada analisis leksikal ini harus dapat
mengenali bagian awal dan akhir setiap komentar supaya dapat
dibuang atau tidak ikut dalam proses kompilasi.
4. Menyeragamkan huruf kapital menjadi huruf kecil atau
sebaliknya : Untuk bahasa bahasa bahasa pemrograman yang bersifat
non case sensitive, identifier arraySize dan arraysize dianggap
sama. Oleh karena itu, bagian penganalisis leksikal bertugas
menyeragamkan jenis huruf agar identifier semacam itu tidak
dianggap berbeda.
5. Membuang spasi 6. Menangani kesalahan
Besaran Leksik Besaran pembangun bahasa / leksik meliputi : 1.
Identifier
Bisa berupa keywords atau nama. Keywords adalah kata kunci yang
sudah didefinisikan oleh suatu bahasa seperti Begin, End, If, dan
Else di dalam Pascal. Nama dideklarasikan sendiri oleh pemakai
seperti nama pada sebuah variabel. Misal :
-
22
Var
Nama : Integer;
Suhu : Real; 2. Nilai Konstanta
Adalah suatu konstanta yang terdapat pada program. Bisa berupa
konstanta integer, real, boolean, character, string, dan
sebagainya.
Misal :
Const
N := 10; Kata := Saya
3. Operator dan Delimiter Operator misalnya +, -, *, dan /.
Menghilangkan Blank Dalam pengetikan suatu program, terkadang
sering terjadi adanya banyak blank yang tidak diperlukan. Salah
satu dari tugas scanner atau lexical analyzer ini adalah untuk
mengabaikan blank yang dimaksud. Sebagai contoh adalah : C = A + B
Maksud dari pernyataan di atas, adalah C = A + B. Jika pernyataan
semacam itu tidak diantisipasi oleh compiler maka pernyataan ini
tidak akan dapat dieksekusi, karena tidak dimengerti oleh compiler.
Berikut ini adalah program untuk menghilangkan blank. Private Sub
Form_Load() c = InputBox("Masukkan Ekspresi:") d = ""
flag = False
For i = 1 To Len(c) If Mid(c, i, 1) = " " Then If flag = False
Then
d = d + Mid(c, i, 1) End If
flag = True
Else
d = d + Mid(c, i, 1) flag = False
End If
-
23
Next i
Debug.Print d
End Sub
Dengan menggunakan Bahasa Pascal : uses crt;
var
ekspresi : String;
tampung:string;
i:integer;
flag:boolean;
begin
clrscr;
flag:=false;
write('Masukkan ekspresi:'); readln(ekspresi); for i:=1 to
length(ekspresi) do begin
if ekspresi[i]=' 'then begin
if flag=false then
tampung:=tampung+ekspresi[i]; flag:=true;
end
else
begin
tampung:=tampung+ekspresi[i]; flag:=false
end;
end;
writeln(tampung); readln;
end.
Dengan menggunakan Bahasa C : #include
#include
#include
void main() {
-
24
clrscr(); char ekspresi[100]; char kalimat[100]; int kar;
int i;
int hitung;
int flag;
hitung=0;
flag=0;
printf("Masukkan Ekspresi:"); gets(ekspresi); for(i=0;i
-
25
b. Pengiriman parameter secara acuan. Jika nilai parameter pada
prosedur diubah akan mempengaruhi nilai parameter
nyata.
Contoh pengiriman parameter secara nilai : uses crt;
procedure hitung(a,b:integer); var
c:integer;
begin
c:=a+b;
writeln('Nilai c = ',c); end;
var
x,y:integer;
begin
write('Masukkan Nilai X :'); readln(x); write('Masukkan Nilai Y
:'); readln(y); hitung(x,y); readln;
end.
Contoh pengiriman parameter secara acuan : uses crt;
procedure hitung(var a,b:integer); var
c:integer;
begin
a:=10;
c:=a+b;
writeln('Nilai c = ',c); end;
var
x,y:integer;
begin
write('Masukkan Nilai X :'); readln(x); write('Masukkan Nilai Y
:'); readln(y);
-
26
hitung(x,y); writeln('Nilai variabel x=',x); readln;
end.
2. Pada Visual Basic Pada VB 6, ada 4 jenis procedure yaitu : a.
Procedure Sub procedure yang tidak mengembalikan nilai setelah
tugasnya
selesai. Sering disebut juga Procedure. b. Procedure Function
Procedure yang mengembalikan nilai setelah tugasnya
selesai. Sering disebut juga Fungsi c. Procedure Event Procedure
untuk sebuah event pada suatu object. Digunakan di
dalam Class Module. d. Procedur Property Procedure untuk
mengubah (Let) dan mengambil (Get) nilai
property pada sebuah object. Digunakan di dalam Class
Module.
Contoh pemakaian Procedure Sub : Private Sub Form_Load() a =
InputBox("Masukkan Panjang:") b = InputBox("Masukkan Lebar:") Call
hitung(Val(a), Val(b)) End Sub
Private Sub hitung(panjang As Integer, lebar As Integer) luas =
panjang * lebar Debug.Print luas
End Sub
3. Pada Bahasa C # include
# include
void hitung(int panjang,int lebar);
void main() { int a,b;
clrscr(); printf("Masukkan Panjang :");
-
27
scanf("%i",&a); printf("Masukkan Lebar:");
scanf("%i",&b); hitung(a,b); getch(); }
void hitung(int panjang,int lebar) { int luas;
luas=panjang*lebar; printf("Luas = %i",luas); }
Pemakaian Fungsi Berikut ini adalah contoh pemakaian fungsi pada
Turbo Pascal 1. Fungsi Tanpa parameter uses crt;
Function garis:string;
begin
garis:='----------------';
end;
begin
writeln(garis); writeln('Pascal'); writeln(garis); readln;
end.
2. Fungsi dengan Parameter uses crt;
function luas(panjang,lebar:integer):integer; begin
luas:=panjang*lebar; end;
var
p,l:integer;
begin
clrscr;
-
28
write('Masukkan Panjang :'); readln(p); write('Masukkan Lebar
:'); readln(l); writeln('Luas=',luas(p,l)); readln;
end.
Pemakaian Fungsi pada Bahasa pemrograman Visual Basic Private
Sub Form_Load() a = InputBox("Masukkan panjang :") b =
InputBox("Masukkan lebar:") luas = luaspersegi(a, b) Debug.Print
luas
End Sub
Private Function luaspersegi(panjang, lebar) luaspersegi =
Val(panjang) * Val(lebar) End Function
Pemakaian fungsi pada Bahasa C # include
# include
int hitung(int panjang,int lebar); void main() { int a,b;
clrscr(); printf("Masukkan Panjang :"); scanf("%i",&a);
printf("Masukkan Lebar:"); scanf("%i",&b);
printf("Luas=%i",hitung(a,b)); getch(); }
int hitung(int panjang,int lebar) { int luas;
luas=panjang*lebar;
-
29
}
Token dan Lexemes Untuk keperluan parsing, suatu pernyataan yang
ada perlu dipisahkan menjadi token dan lexemes. Ada sebagian
pendapat yang menyamakan antara token dan lexemes dengan hanya
menggunakan istilah token saja. Namun, tidak jarang kita menemukan
pendapat yang membedakan antara token dengan lexemes ini. Secara
umum, token
menyatakan suatu kelompok misalnya kelompok identifier, operator
atau delimiter, ataupun konstanta. Sedangkan lexemes menjelaskan
anggota anggota dari token bersangkutan.
Berikut ini adalah program untuk Memisahkan suatu input menjadi
bagian bagiannya : Dengan menggunakan bahasa pascal : uses crt;
var
Kalimat:string;
i,n:integer;
pos:array[1..100]of integer; posisi:integer;
kar:array[1..100] of string; token:array[1..100] of string;
karb:string;
begin
clrscr;
posisi:=1;
karb:='';
write('Masukkan sebuah kalimat:'); readln(kalimat);
kalimat:=kalimat+' ';
for i:=1 to length(kalimat) do begin
if kalimat[i]' 'then begin
karb:=karb+kalimat[i]; end
else if (kalimat[i]=' ') then Begin
-
30
kar[posisi]:=karb; karb:='';
posisi:=posisi+1;
end;
end;
for i:=1 to posisi-1 do
begin
write('Kata ke- ',i,' adalah ',kar[i]); writeln;
end;
readln;
end.
Program untuk mengecek apakah input terdapat di dalam array
identifier atau tidak. Misal identifier itu terdiri dari kata If
dan Then Input yang dimasukkan adalah :
If nama= Anton then lakukan penyeleksian
Maka tampilan hasil program adalah sebagai berikut :
If termasuk identifier Nama= bukan identifir Anton bukan
identifier Then termasuk identifier
Lakukan bukan identifier Penyeleksian bukan identifier.
Programnya adalah sebagai berikut : uses crt;
var
Kalimat:string;
i,n,j,jiden,hitung:integer; pos:array[1..100]of integer;
posisi:integer;
kar:array[1..100] of string; iden:array[1..100] of string;
karb:string;
begin
clrscr;
-
31
posisi:=1;
hitung:=1;
karb:='';
write('Masukkan jumlah identifier:'); readln(jiden);
write('Masukkan sebuah kalimat:'); readln(kalimat);
kalimat:=kalimat+' ';
for i:=1 to length(kalimat) do begin
if kalimat[i]' 'then begin
karb:=karb+kalimat[i]; end
else if (kalimat[i]=' ') then Begin
kar[posisi]:=karb; karb:='';
posisi:=posisi+1;
end;
end;
writeln('Posisi=',posisi); for i:=1 to jiden do begin
write('Masukkan identifier:'); readln(iden[i]); end;
for i:=1 to posisi-1 do
begin
for j:=1 to jiden do begin
if kar[i]iden[j] then begin
if hitung=jiden then begin
writeln('Kata ',kar[i],' Bukan Termasuk Identifier'); end;
hitung:=hitung+1;
-
32
end
else
begin
writeln('Kata ',kar[i],' Termasuk Identifier'); hitung:=1;
j:=jiden; end;
end;
hitung:=1;
end;
readln;
end.
Pembuatan Unit Sebelum kita mempelajari penggunaan unit, maka
ada baiknya program yang udah dibuat, kita jadikan menggunakan
Function ataupun Procedure.
Pada soal sebelumnya untuk pemisahan suatu kalimat menjadi
bagian bagian pembentuknya dapat dibuat menjadi sebuah procedure
seperti yang tampak pada program di bawah ini.
uses crt;
procedure pisah(var a:string); var
i,n,posisi:integer;
kar,token:array[1..20] of string; karb:string;
begin
posisi:=1;
karb:='';
a:=a+' ';
for i:=1 to length(a) do begin
if a[i]' 'then begin
karb:=karb+a[i]; end
else if (a[i]=' ') then
-
33
Begin
kar[posisi]:=karb; karb:='';
posisi:=posisi+1;
end;
end;
for i:=1 to posisi-1 do
begin
write('Kata ke- ',i,' adalah ',kar[i]); writeln;
end;
end;
var
Kalimat:string;
begin
clrscr;
write('Masukkan sebuah kalimat:'); readln(kalimat);
pisah(kalimat); readln;
end.
Bila dibuat dalam bentuk unit menjadi. unit mesin;
interface
procedure pisah(var a:string); implementation
uses crt;
procedure pisah;
var
i,n,posisi:integer;
{pos:array[1..100]of integer;} kar,token:array[1..20] of string;
karb:string;
begin
posisi:=1;
karb:='';
a:=a+' ';
for i:=1 to length(a) do begin
-
34
if a[i]' 'then begin
karb:=karb+a[i]; end
else if (a[i]=' ') then Begin
kar[posisi]:=karb; karb:='';
posisi:=posisi+1;
end;
end;
for i:=1 to posisi-1 do
begin
write('Kata ke- ',i,' adalah ',kar[i]); writeln;
end;
end;
end.
Sedangkan programnya menjadi : uses crt,mesin;
var
Kalimat:string;
begin
clrscr;
write('Masukkan sebuah kalimat:'); readln(kalimat);
pisah(kalimat); readln;
end.
Analisis Sintaks Sintaks adalah susunan kalimat dan aturan
aturan dalam membentuk kalimat disebut
grammar. Penganalisis sintaks dalam bidang kompilasi sering
disebut dengan parser.
Aturan pendeklarasian variabel :
1. Samping kiri : pasti variabel 2. Samping kanan : pasti tipe
data
3. Karakter paling kiri dari suatu variabel harus berupa
huruf
-
35
4. Karakter selanjutnya harus berupa Huruf ataupun angka
Program untuk mengecek bagian paling kiri dari suatu variabel
yang harus berupa huruf. uses crt;
var
variabel : String;
begin
clrscr;
write('Masukkan variabel:'); readln(variabel); if
((ord(variabel[1])>=65) and (ord(variabel[1])=97) and
(ord(variabel[1])
-
36
if not(((ord(variabel[i])>=65) and (ord(variabel[i])=97) and
(ord(variabel[i])=48) and (ord(variabel[i])
-
37
variabel : String;
tdata:string;
tipe:array[1..100] of string; posisi,i,jlh_tipe:integer;
flag:boolean;
begin
clrscr;
flag:=false;
write('Masukkan variabel:'); readln(variabel); write('Masukkan
tipe data yang dikenali:'); readln(jlh_tipe); for i:=1 to jlh_tipe
do begin
write('Masukkan tipe data ke-[',i,']:'); readln(tipe[i]);
end;
for i:=1 to length(variabel) do begin
if variabel[i]=':' then posisi:=i;
end;
for i:=posisi+1 to length(variabel) do tdata:=tdata+variabel[i];
writeln('Tipe data anda adalah :',tdata);
for i:=1 to jlh_tipe do begin
if tdata=tipe[i] then flag:=true;
end;
if flag=true then
writeln('Tipe data yang anda masukkan yaitu ',tdata, ' Sudah
terdaftar') else
writeln('Periksa kembali tipe data Anda yaitu ',tdata);
readln;
end.
-
38
Untuk perbandingan ada baiknya tipe data Anda terlebih dahulu
dikonversi menjadi huruf besar semua. uses crt;
var
variabel : String;
tdata,tdatab,tampung,tampungb:string;
tipe,tipeb:array[1..100] of string; posisi,i,jlh_tipe,j:integer;
flag:boolean;
begin
clrscr;
flag:=false;
write('Masukkan variabel:'); readln(variabel); write('Masukkan
tipe data yang dikenali:'); readln(jlh_tipe); for i:=1 to jlh_tipe
do begin
write('Masukkan tipe data ke-[',i,']:'); readln(tipe[i]);
end;
for i:=1 to length(variabel) do begin
if variabel[i]=':' then posisi:=i;
end;
for i:=posisi+1 to length(variabel) do
tdata:=tdata+variabel[i];
for i:=1 to length(tdata) do tdatab:=tdatab+upcase(tdata[i]);
writeln('Tipe data anda adalah :',tdatab);
for i:=1 to jlh_tipe do begin
tampung:=tampung+tipe[i]; for j:=1 to length(tampung) do
tampungb:=tampungb+upcase(tampung[j]); tipeb[i]:=tampungb;
-
39
tampung:='';
tampungb:='';
end;
for i:=1 to jlh_tipe do begin
writeln(tipeb[i]); end;
for i:=1 to jlh_tipe do begin
if tdatab=tipeb[i] then flag:=true;
end;
if flag=true then
writeln('Tipe data yang anda masukkan yaitu ',tdata, ' Sudah
terdaftar') else
writeln('Periksa kembali tipe data Anda yaitu ',tdata);
readln;
end.
Penggunaan File Dalam perancangan suatu kompiler, sering
digunakan suatu file untuk menyimpan source code yang diketikkan
oleh user. User mengetikkan program mereka kemudian barulah program
tersebut dikompilasi. Cara yang hampir mirip diterapkan pada
bahasa pemrograman Java. Pada bahasa pemrograman Pascal ada dua
tipe teks yaitu : 1. File Teks
2. File Bertipe
Kedua jenis file ini mempunyai cara pemakaian yang berbeda. File
bertipe lebih mudah dipakai, namun kita tidak dapat mengetikkan
source program secara langsung pada suatu teks editor.
File Bertipe File bertipe untuk memasukkan data : Uses crt;
Type
Mahasiswa=record
-
40
Nomor : integer;
Nama: String;
Nilai: String;
End;
Var
FileMahasiswa:File of Mahasiswa;
RecordMahasiswa: Mahasiswa;
I,n:Byte;
Begin
Assign ( FileMahasiswa,'MHS.txt'); Rewrite ( FileMahasiswa );
Clrscr;
Write('Ketikkan Banyak Mahasiswa:'); Readln(n); For i:= 1 to n
do
Begin
Writeln('Mahasiswa ke-',i); Write('Nomor:');
Readln(RecordMahasiswa.Nomor); Write('Nama:');
Readln(RecordMahasiswa.Nama); Write('Nilai:');
Readln(RecordMahasiswa.Nilai);
Write(FileMahasiswa,RecordMahasiswa); Writeln;
End;
Close ( FileMahasiswa ); End.
File bertipe untuk menampilkan keseluruhan data : uses crt;
type
mahasiswa=record
Nomor :integer;
nama : String;
Nilai : String;
end;
var
FileMahasiswa : File of Mahasiswa;
-
41
RecordMahasiswa : Mahasiswa;
i:integer;
begin
Assign (FileMahasiswa,'Mhs.txt'); reset(FileMahasiswa);
clrscr;
writeln('-----------------------------'); writeln('Nomor ');
writeln('Mhs Nama Mahasiswa Nilai');
writeln('-----------------------------'); while not
eof(filemahasiswa) do begin
read(FileMahasiswa,RecordMahasiswa); with RecordMahasiswa do
writeln(Nomor:2,Nama:10,Nilai:14); end;
writeln('------------------------------'); readln;
close(FileMahasiswa); end.
File bertipe untuk menampilkan data tertentu uses crt;
type
mahasiswa=record
Nomor :integer;
nama : String;
Nilai : String;
end;
var
FileMahasiswa : File of Mahasiswa;
RecordMahasiswa : Mahasiswa;
i,cari:integer;
ketemu:boolean;
begin
Assign (FileMahasiswa,'Mhs.txt'); reset(FileMahasiswa);
clrscr;
Write('Ketik no. mahasiswa yang ingin dibaca:'); Readln(cari);
while not eof(filemahasiswa) do
-
42
begin
read(filemahasiswa,recordmahasiswa);
if(recordmahasiswa.nomor=cari) then begin
ketemu:=true;
writeln('nama Mahasiswa:',recordmahasiswa.nama); writeln('Nilai
Mahasiswa:',recordmahasiswa.nilai); end;
end;
readln;
end.
File Teks File Teks untuk memasukkan data: Uses crt;
Var
BerkasTeks : Text;
KodeBrg : String;
NamaBrg : String;
UnitBrg : string;
HargaBrg:String;
lagi,jawab : char; sudahada : Boolean;
Begin
Assign ( berkasteks,'Dataku.txt'); sudahada:=(ioresult=0); if
sudahada then
begin
jawab:=' '; while not((jawab='Y') or (jawab='T')) do begin
write(chr(7)); write('File sudah pernah ada, tumpangi !!!!(Y/T)
?'); readln(Jawab); jawab:=upcase(jawab); end;
if jawab='T' then halt; end;
rewrite(BerkasTeks);
-
43
lagi:='Y';
while upcase(lagi)='Y' do begin
clrscr;
gotoxy(5,6); write('Kode Barang :'); gotoxy(5,8); write('Nama
Barang :'); gotoxy(5,10); write('Unit Barang:'); gotoxy(5,12);
write('Harga Satuan Barang :');
gotoxy(27,6); Readln(KodeBrg); gotoxy(27,8); Readln(NamaBrg);
gotoxy(27,10); Readln(UnitBrg); gotoxy(27,12);
Readln(HargaBrg);
writeln(BerkasTeks,kodebrg); writeln(BerkasTeks,namabrg);
writeln(BerkasTeks,unitbrg); writeln(BerkasTeks,hargabrg);
gotoxy(5,15); write('Ada Lagi?(Y/T)'); readln(lagi); end;
close(berkasteks); end.
End.
File teks untuk menampilkan semua data Uses Crt;
Var
BerkasTeks : Text;
KodeBrg : string;
NamaBrg : string;
-
44
UnitBrg :string;
hargabrg:string;
I,n : byte;
Begin
Assign ( berkasteks,'Dataku.txt'); Reset ( berkasteks);
Clrscr;
Writeln('--------------------------------------------');
writeln(' Kode Unit harga '); writeln(' Brg Nama Barang Akhir
Satuan');
writeln('-----------------------------------------------------');
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kodebrg,namabrg,unitbrg,hargabrg);
write(kodeBrg,' ',namaBrg,' ',unitbrg,' ',hargabrg); end;
close ( BerkasTeks ); readln;
end.
File teks untuk menampilkan data tertentu : uses crt;
var
berkasteks:text;
kodebrg:string;
namabrg:string;
unitbrg:string;
hargabrg:string;
kodecari:string;
spasi:string;
lagi:char;
begin
assign(berkasteks,'Dataku.txt'); lagi:='Y';
while upcase(lagi)='Y' do begin
-
45
reset(berkasteks); clrscr;
write('Kode Barang dicari ?'); readln(kodecari); writeln;
while(not eof(berkasteks)) and (kodebrgkodecari) do
readln(berkasteks,kodebrg); readln(berkasteks,namabrg);
readln(berkasteks,unitbrg); readln(berkasteks,hargabrg);
if kodebrg=kodecari then
begin
writeln('kode barang:',kodeBrg); writeln('Nama
barang:',namaBrg); writeln('unit barang:',unitBrg); writeln('harga
barang:',hargaBrg); end
else
writeln('Tidak ada data barang ini !!!');
close(berkasteks); writeln;
writeln('Ada Lagi data yang akan dicari (Y/T)'); readln(lagi);
end;
readln;
end.
Perhatikan bahwa untuk mahasiswa.txt, hasil dari File bertipe
berisi :
-
46
Dan hasil dari file teks (dataku.txt) berisi :
-
47
Soal :
Buatlah program untuk memisahkan pendeklarasian variabel yang
jumlahnya lebih dari satu.
Contoh : Panjang,lebar,luas:integer Dipisahkan menjadi :
Variabel 1 : Panjang Variabel 2 : Lebar Variabel 3 : Luas Jawab :
uses crt;
var
variabel : String;
tdata:string;
posisi,i:integer;
-
48
pkar:integer;
kar:array[1..100] of string; karb:string;
begin
clrscr;
write('Masukkan variabel:'); readln(variabel);
for i:=1 to length(variabel) do begin
if variabel[i]=':' then posisi:=i;
end;
for i:=1 to posisi-1 do
tdata:=tdata+variabel[i]; writeln(tdata);
tdata:=tdata+',';
pkar:=1;
karb:='';
for i:=1 to length(tdata) do begin
if tdata[i]','then begin
karb:=karb+tdata[i]; end
else if (tdata[i]=',') then Begin
kar[pkar]:=karb; karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
-
49
readln;
end.
Pemakaian Procedure uses crt;
procedure cek(tdata:string); var
i:integer;
pkar:integer;
kar:array[1..20] of string; karb:string;
begin
tdata:=tdata+',';
pkar:=1;
karb:='';
for i:=1 to length(tdata) do begin
if tdata[i]','then begin
karb:=karb+tdata[i]; end
else if (tdata[i]=',') then Begin
kar[pkar]:=karb; karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
end;
var
variabel : String;
i,posisi:integer;
tdata:string;
-
50
begin
clrscr;
write('Masukkan variabel:'); readln(variabel); for i:=1 to
length(variabel) do begin
if variabel[i]=':' then posisi:=i;
end;
for i:=1 to posisi-1 do
tdata:=tdata+variabel[i]; cek(tdata); readln;
end.
Pemakaian Unit
Unit kompilasi.pas unit kompilasi;
interface
procedure cek(tdata:string); implementation
uses crt;
procedure cek(tdata:string); var
i:integer;
pkar:integer;
kar:array[1..20] of string; karb:string;
begin
tdata:=tdata+',';
pkar:=1;
karb:='';
for i:=1 to length(tdata) do begin
if tdata[i]','then begin
karb:=karb+tdata[i];
-
51
end
else if (tdata[i]=',') then Begin
kar[pkar]:=karb; karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
end;
end.
Program Cek.pas uses kompilasi,crt;
var
variabel : String;
i,posisi:integer;
tdata:string;
begin
clrscr;
write('Masukkan variabel:'); readln(variabel); for i:=1 to
length(variabel) do begin
if variabel[i]=':' then posisi:=i;
end;
for i:=1 to posisi-1 do
tdata:=tdata+variabel[i]; cek(tdata); readln;
end.
-
52
Aturan Pendeklarasian Konstanta Konstanta adalah suatu tempat
untuk menampung nilai di mana nilai yang ditampung
adalah tetap dan tidak dapat berubah. Secara umum bentuk
pendeklarasian variabel pada suatu konstanta adalah dituliskan
sebagai : Konstanta = Nilai
Contoh :
Panjang = 1 Nama = Hartono
Jadi, pada suatu konstanta untuk nilai selain angka maka harus
diapit dengan tanda petik ganda. Program untuk memisahkan nama
konstanta dari nilai konstanta. uses crt;
var
kons : String;
konstanta:string;
posisi,i:integer;
flag:boolean;
begin
clrscr;
write('Masukkan deklarasi konstanta:'); readln(kons);
for i:=1 to length(kons) do begin
if kons[i]='=' then posisi:=i;
end;
for i:=1 to posisi-1 do
konstanta:=konstanta+kons[i]; writeln('Nama konstanta adalah
:',konstanta); readln;
end.
Program untuk memisahkan nilai konstanta dari nama konstanta.
uses crt;
var
kons : String;
-
53
nkonstanta:string;
posisi,i:integer;
flag:boolean;
begin
clrscr;
write('Masukkan deklarasi konstanta:'); readln(kons);
for i:=1 to length(kons) do begin
if kons[i]='=' then posisi:=i;
end;
for i:=posisi+1 to length(kons) do
nkonstanta:=nkonstanta+kons[i]; writeln('Nilai konstanta adalah
:',nkonstanta); readln;
end.
Program untuk mengecek kebenaran nama konstanta yang dimasukkan.
uses crt;
var
kons : String;
nkonstanta:string;
posisi,i:integer;
flag:boolean;
str:boolean;
begin
clrscr;
flag:=true;
write('Masukkan deklarasi konstanta:'); readln(kons);
for i:=1 to length(kons) do begin
if kons[i]='=' then posisi:=i;
end;
-
54
for i:=posisi+1 to length(kons) do
nkonstanta:=nkonstanta+kons[i]; writeln('Nilai konstanta adalah
:',nkonstanta); for i:=1 to length(nkonstanta) do begin
if ((ord(nkonstanta[i])>=48) and (ord(nkonstanta[i])
-
55
for i:=1 to length(kons) do begin
if kons[i]='=' then posisi:=i;
end;
for i:=posisi+1 to length(kons) do
nkonstanta:=nkonstanta+kons[i];
for i:=1 to length(nkonstanta) do begin
if ((ord(nkonstanta[i])>=48) and (ord(nkonstanta[i])
-
56
end.
Type Checking Kompiler harus memeriksa apakah source program
mengikuti konvensi sintaksis atau
semantik dari source language. Pemeriksaan ini disebut static
checking, untuk meyakinkan bahwa kesalahan programming akan
dideteksi dan dilaporkan.
Static Checking : Checking yang dilakukan oleh kompiler Dynamic
Checking : Checking yang dilakukan oleh target program
Posisi Type Checking dalam kompiler :
Analisis Leksikal dan Sintaksis dengan File Pada bagian ini kita
akan melihat bagaimana imnplementasi dari file pada perancangan
suatu kompiler. Di sini peran dari file adalah untuk menyimpan
source code, menyimpan tipe data yang dikenali, menyimpan nama
variabel, nama konstanta, dan lain lain.
Misalkan pada kompiler yang kita rancang mempunyai kemampuan
untuk mengenali
tipe data : 1. Char 2. String 3. Integer dengan jangkauan dari
-32768 s/d 32767 4. LongInt dengan jangkauan dari -2147483648 s/d
2147483647 5. Real untuk bilangan desimal
Berikut ini adalah contoh penggunaan dari file untuk menyimpan
tipe data yang kita kenali pada suatu file. Langkah langkahnya
adalah sebagai berikut.
Parser
Type Checker
Intermediate Code
Generator
Token Syntax
-
57
1. Buat program untuk membentuk file dengan nama tdata.dat untuk
menyimpan tipe data yang kita kenali
2. Buat program untuk menyimpan tipe data beserta dengan
jangkauannya ke dalam file tdata.dat yang telah kita buat
sebelumnya.
Program untuk membentuk file tdata.dat Uses crt;
Var
VF:text;
Begin
Assign ( VF,'C:\tdata.dat'); Rewrite ( VF ); Close ( VF );
End.
Program untuk menyimpan tipe data. Uses crt;
Var
BerkasTeks : Text;
tipe : String;
tipeb: string;
jangkauan : String; lagi,jawab : char; sudahada : Boolean;
i:integer;
Begin
Assign ( berkasteks,'C:\tdata.dat'); rewrite(BerkasTeks);
lagi:='Y';
while upcase(lagi)='Y' do begin
clrscr;
gotoxy(5,6); write('Tipe Data :'); gotoxy(5,8); write('Jangkauan
:');
gotoxy(27,6); Readln(tipe);
-
58
gotoxy(27,8); Readln(jangkauan);
for i:=1 to length(tipe) do tipeb:=tipeb+upcase(tipe[i]);
writeln(BerkasTeks,tipeb); writeln(BerkasTeks,jangkauan);
tipeb:=;
gotoxy(5,15); write('Ada Lagi?(Y/T)'); readln(lagi); end;
close(berkasteks); end.
Menyimpan reserved word Pada setiap bahasa pemrograman tentu ada
reserved word (kata tercadang), kata tercadang itu tidak dapat kita
gunakan sebagai nama variabel. Kata tercadang itu
masing masing mempunyai kegunaan seperti : for untuk perulangan,
var untuk
-
59
pendeklarasian variabel, dan lain lain. Oleh karena itu, juga
ada baiknya kalau kata tercadang itu disimpan di dalam suatu file
yang digunakan khusus untuk menampung
reserved word, misalkan nama file yang dimaksud adalah
cadang.dat.
Program untuk membuat file cadang.dat Uses crt;
Var
VF:text;
Begin
Assign ( VF,'C:\cadang.dat'); Rewrite ( VF ); Close ( VF );
End.
Program untuk mengetikkan reserved word ke dalam file. Uses
crt;
Var
BerkasTeks : Text;
cadang : String;
cadangb: string;
lagi,jawab : char; sudahada : Boolean;
Begin
Assign ( berkasteks,'C:\cadangan.dat'); rewrite(BerkasTeks);
lagi:='Y';
while upcase(lagi)='Y' do begin
clrscr;
gotoxy(5,6); write('Reserved Word :'); gotoxy(27,6);
Readln(cadang);
for i:=1 to length(cadang) do
cadangb:=cadangb+upcase(cadang[i]);
writeln(BerkasTeks,cadangb);
cadangb:='';
-
60
gotoxy(5,15); write('Ada Lagi?(Y/T)'); readln(lagi); end;
close(berkasteks); end.
Menyimpan variabel Variabel di dalam perancangan suatu kompiler
sering dianggap sebagai bagian di
dalam suatu program, atau dengan kata lain tidak diperlukan
upaya untuk menyimpan variabel tersebut ke dalam suatu file. Namun,
untuk efisiensi di dalam program, ada baiknya variabel tersebut di
tempatkan ke dalam suatu file sehingga upaya untuk mengeceknya
dapat menjadi lebih mudah, terutama apabila variabel tersebut
sering digunakan di dalam program.
Berikut ini adalah contoh program untuk membuat file
variabel.dat untuk menyimpan nama variabel. Uses crt;
Var
VF:text;
Begin
Assign ( VF,'C:\variabel.dat'); Rewrite ( VF ); Close ( VF );
End.
Mengecek kebenaran pendeklarasian variabel pada suatu File
Misalkan program yang diketik pada suatu teks editor adalah sebagai
berikut. Vari
Panjang,lebar,luas:integer; end vari
Maka yang perlu diperhatikan adalah sebagai berikut.
1. Harus ada keyword vari 2. Cek pengetikan deklarasi
variabel
-
61
a. Cek tipe data yang ada apakah sudah sesuai dengan tipe data
yang dikenali pada program atau tidak
b. Cek apakah pada pengetikan deklarasi variabel sudah ada titik
koma ( ; ) atau tidak
c. Cek pengetikan variabel dengan kriteria : - karakter pertama
pada nama variabel harus berupa huruf
- nama variabel tidak boleh sama dengan reserved word - panjang
karakter maksimal adalah 32 karakter - huruf kedua dan selanjutnya
pada nama variabel harus berupa huruf
ataupun angka.
Berikut ini adalah program untuk menampilkan kembali isi source
code yang telah diketikkan dalam suatu array. Uses Crt;
Var
BerkasTeks : Text;
kode:string;
arkode : array [1..100] of string; I,n : byte;
Begin
n:=1;
i:=1;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); writeln(kode); arkode[i]:=kode;
n:=n+1;
i:=i+1;
end;
close ( BerkasTeks );
for i:=1 to n-1 do
begin
-
62
writeln('isi kode baris - ',i,' adalah : ',arkode[i]); end;
readln;
end.
Program untuk mengecek apakah pendeklarasian variabel terdapat
keyword vari dan tanda ; atau tidak. Uses Crt;
Var
BerkasTeks : Text;
kode:string; {untuk menampung kode} kodeb:string; {untuk
menampung huruf besar dari kode} arkode : array [1..100] of string;
{untuk menampung kode dalam {huruf besar} I,n,j,posisi1,posisi2 :
byte; possalah:byte;
cekvar:string;
flag:boolean; {menampung status ;} Begin
n:=1;
i:=1;
flag:=true;
possalah:=0;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
close ( BerkasTeks );
-
63
for i:=1 to n-1 do
begin
if arkode[i]='VARI' then posisi1:=i;
if arkode[i]='END VARI' then posisi2:=i;
end;
for I:=posisi1+1 to posisi2-1 do
begin
cekvar:=arkode[i]; if (cekvar[length(cekvar)]=';') and
(flag=true) then flag:=true;
if (cekvar[length(cekvar)]';') and (flag=true) then begin
flag:=false;
possalah:=i;
end;
cekvar:='';
end;
if flag=true then
writeln('ada titik koma') else
writeln('tidak ada titik koma pada baris ke-',possalah);
readln;
end.
Berikut ini adalah program untuk memisahkan variabel yang sudah
kita definisikan di dalam file. Uses Crt;
Var
BerkasTeks : Text;
kode,tvari,karb:string; {untuk menampung kode} kodeb:string;
{untuk menampung huruf besar dari kode} arkode : array [1..100] of
string; {untuk menampung kode dalam {huruf besar}
l,I,o,n,j,posisi1,posisi2,pkar,k : byte; cekvar:string;
variabel1:string; {untuk menampung bagian dklarasi variabel}
posisi:integer;
-
64
arvari:array[1..25] of string; kar:array[1..25] of string;
vari:array[1..25] of string; Begin
n:=1;
i:=1;
k:=1;
o:=1;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
close ( BerkasTeks );
for i:=1 to n-1 do
begin
if arkode[i]='VARI' then posisi1:=i;
if arkode[i]='END VARI' then posisi2:=i;
end;
for I:=posisi1+1 to posisi2-1 do
begin
cekvar:=arkode[i]; for j:=1 to length(cekvar) do begin
if cekvar[j]=':' then posisi:=j; end;
for j:=1 to posisi-1 do
-
65
variabel1:=variabel1+cekvar[j]; arvari[o]:=variabel1;
variabel1:='';
o:=o+1;
end;
pkar:=1;
karb:='';
l:=1;
for i:=1 to o-1 do
begin
tvari:=tvari+arvari[i]; tvari:=tvari+',';
end;
writeln(tvari);
for j:=1 to length(tvari) do begin
if tvari[j]','then begin
karb:=karb+tvari[j]; end
else if (tvari[j]=',') then Begin
kar[pkar]:=karb; karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
readln;
end.
-
66
Berikut ini adalah program untuk mengecek apakah variabel yang
digunakan oleh user sudah dideklarasikan atau belum. Uses Crt;
Var
BerkasTeks : Text;
kode,tvari,karb:string; {untuk menampung kode} kodeb:string;
{untuk menampung huruf besar dari kode} arkode : array [1..100] of
string; {untuk menampung kode dalam {huruf besar}
l,I,o,n,j,posisi1,posisi2,pkar,k : byte; cekvar:string;
variabel1:string; {untuk menampung bagian dklarasi variabel}
posisi:integer;
arvari:array[1..25] of string; kar:array[1..25] of string;
vari:array[1..25] of string; flag:boolean;
Begin
n:=1;
i:=1;
k:=1;
flag:=true;
o:=1;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
close ( BerkasTeks );
-
67
for i:=1 to n-1 do
begin
if arkode[i]='VARI' then posisi1:=i;
if arkode[i]='END VARI' then posisi2:=i;
end;
for I:=posisi1+1 to posisi2-1 do
begin
cekvar:=arkode[i]; for j:=1 to length(cekvar) do begin
if cekvar[j]=':' then posisi:=j; end;
for j:=1 to posisi-1 do variabel1:=variabel1+cekvar[j];
arvari[o]:=variabel1; variabel1:='';
o:=o+1;
end;
pkar:=1;
karb:='';
l:=1;
for i:=1 to o-1 do
begin
tvari:=tvari+arvari[i]; tvari:=tvari+',';
end;
writeln(tvari);
for j:=1 to length(tvari) do begin
if tvari[j]','then begin
karb:=karb+tvari[j]; end
else if (tvari[j]=',') then Begin
-
68
kar[pkar]:=karb; karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
posisi1:=0;
posisi2:=0;
for i:=1 to n-1 do
begin
if arkode[i]='PROGRAM' then posisi1:=i;
if arkode[i]='END PROGRAM' then posisi2:=i;
end;
cekvar:='';
o:=0;
for i:=posisi1+1 to posisi2-1 do
begin
cekvar:=arkode[i]; for j:=1 to pkar-1 do begin
if (cekvar=kar[j])then o:=o+1;
end;
writeln(cekvar);
end;
if o=((posisi2-1)-(posisi1+1)+1) then writeln('semua variabel
dikenal') else
writeln('Ada variabel yang tidak dikenal');
readln;
end.
-
69
Berikut ini adalah program untuk mengecek apakah nama suatu
variabel sama dengan Reserved Word atau tidak. Uses Crt;
Var
BerkasTeks : Text;
kode,tvari,karb:string; {untuk menampung kode} kodeb:string;
{untuk menampung huruf besar dari kode} arkode : array [1..100] of
string; {untuk menampung kode dalam {huruf besar}
l,I,o,n,j,posisi1,posisi2,pkar,k : byte; cekvar:string;
variabel1:string; {untuk menampung bagian dklarasi variabel}
posisi:integer;
arvari:array[1..25] of string; kar:array[1..25] of string;
vari:array[1..25] of string; flag:boolean;
Begin
n:=1;
i:=1;
k:=1;
o:=1;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
close ( BerkasTeks );
for i:=1 to n-1 do
-
70
begin
if arkode[i]='VARI' then posisi1:=i;
if arkode[i]='END VARI' then posisi2:=i;
end;
for I:=posisi1+1 to posisi2-1 do
begin
cekvar:=arkode[i]; for j:=1 to length(cekvar) do begin
if cekvar[j]=':' then posisi:=j; end;
for j:=1 to posisi-1 do variabel1:=variabel1+cekvar[j];
arvari[o]:=variabel1; variabel1:='';
o:=o+1;
end;
pkar:=1;
karb:='';
l:=1;
for i:=1 to o-1 do
begin
tvari:=tvari+arvari[i]; tvari:=tvari+',';
end;
writeln(tvari);
for j:=1 to length(tvari) do begin
if tvari[j]','then begin
karb:=karb+tvari[j]; end
else if (tvari[j]=',') then Begin
kar[pkar]:=karb;
-
71
karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
Assign ( berkasteks,'c:\cadang.dat'); Reset ( berkasteks); While
not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for i:=1 to pkar-1 do
begin
for j:=1 to length(kode) do kodeb:=kodeb+upcase(kode[j]); if
kar[i]=kodeb then flag:=true;
kodeb:='';
end;
end;
if flag=true then
writeln('nama variabel tidak boleh sama dengan reserved word')
else
writeln('Nama variabel sudah benar');
readln;
end.
Berikut ini adalah perancangan compiler untuk mengecek
keberadaan komentar pada
suatu program (untuk yang lebih 1 baris). Uses Crt;
Var
BerkasTeks : Text;
kode:string; {untuk menampung kode}
-
72
kodeb:string; {untuk menampung huruf besar dari kode} arkode :
array [1..100] of string; {untuk menampung kode dalam {huruf besar}
I,n,j,posisi1,posisi2 : byte; possalah:byte;
cekvar:string;
flag:boolean; {menampung status ;} Begin
n:=1;
i:=1;
flag:=true;
possalah:=0;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
close ( BerkasTeks );
for i:=1 to n-1 do
begin
if arkode[i]='{' then posisi1:=i;
if arkode[i]='}' then posisi2:=i;
end;
writeln('Komentar yang Anda masukkan adalah:'); for I:=posisi1+1
to posisi2-1 do
begin
cekvar:=arkode[i]; writeln(cekvar); end;
-
73
readln;
end.
Pada compiler yang kita rancang nantinya, maka apabila telah
dibuat tanda {, harus diakhiri dengan tanda }, karena jika tidak
akan ditampilkan pesan kesalahan seperti yang tampak pada contoh
berikut.
Berikut ini adalah program untuk mengecek kesalahan akibat
kurangnya tanda tutup kurung kurawal (}). Uses Crt;
Var
BerkasTeks : Text;
kode:string; {untuk menampung kode} kodeb:string; {untuk
menampung huruf besar dari kode} arkode : array [1..100] of string;
{untuk menampung kode dalam {huruf besar} I,n,j,posisi1,posisi2 :
byte; possalah:byte;
cekvar:string;
flag:boolean; {menampung status ;} Begin
posisi1:=0;
posisi2:=0;
n:=1;
i:=1;
flag:=true;
possalah:=0;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
-
74
close ( BerkasTeks );
for i:=1 to n-1 do
begin
if arkode[i]='{' then posisi1:=i;
if arkode[i]='}' then posisi2:=i;
end;
if (posisi1=0) or (posisi2=0) then writeln('Perhatikan tanda {
atau } yang anda deklarasikan') else
begin
writeln('Komentar yang Anda masukkan adalah:'); for I:=posisi1+1
to posisi2-1 do
begin
cekvar:=arkode[i]; writeln(cekvar); end;
end;
readln;
end.
Berikut ini adalah program untuk mengecek komentar yang hanya 1
baris (bisa melekat pada source code). Dalam hal ini ditandai
dengan * Uses Crt;
Var
BerkasTeks : Text;
kode:string; {untuk menampung kode} kodeb:string; {untuk
menampung huruf besar dari kode} arkode : array [1..100] of string;
{untuk menampung kode dalam {huruf besar} I,n,j,posisi1,posisi2 :
byte; possalah:byte;
cekvar:string;
flag:boolean; {menampung status ;} Begin
n:=1;
-
75
i:=1;
flag:=true;
possalah:=0;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
kodeb:='';
posisi1:=1;
posisi2:=1;
for i:=1 to n-1 do
begin
kodeb:=arkode[i]; for j:=1 to length(kodeb) do begin
if kodeb[j]='*' then begin
posisi1:=j; posisi2:=i;
end;
end;
end;
kodeb:='';
kodeb:=arkode[posisi2]; write('Isi komentar anda adalah: '); for
i:=posisi1+1 to length(kodeb) do write(kodeb[i]);
readln;
end.
-
76
Berikut ini adalah program untuk menghilangkan spasi kosong pada
bagian sebelah kiri program. Uses Crt;
Var
BerkasTeks : Text;
kode:string;
arkode : array [1..100] of string; I,n,k,posisi: byte;
tampung:string;
kode1:string;
arkode1:array[1..100] of string; flag:boolean;
Begin
n:=1;
i:=1;
flag:=false;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); arkode[i]:=kode; n:=n+1;
i:=i+1;
end;
for i:=1 to n-1 do
begin
kode1:=arkode[i]; if kode1[1]=' 'then begin
for k:=1 to length(kode1) do begin
if ((kode1[k]' ') and (flag=false)) then
begin
posisi:=k;
flag:=true;
end;
end;
-
77
flag:=false;
for k:=posisi to length(kode1) do begin
tampung:=tampung+kode1[k]; end;
end
else
begin
for k:=1 to length(kode1) do begin
tampung:=tampung+kode1[k]; end;
end;
arkode1[i]:=tampung; tampung:='';
kode1:='';
end;
for i:=1 to n-1 do
begin
writeln('isi kode baris ke -',i, ' adalah : ',arkode1[i]);
end;
close ( BerkasTeks ); readln;
end.
Selain proses penghilangan spasi di bagian kiri, terkadang ada
bagian tertentu di
dalam program yang tidak mengizinkan adanya spasi, seperti
bagian program yang ada di dalam blok Vari dan End Vari. Berikut
ini adalah program untuk menghilangkan keseluruhan spasi yang ada
di dalam
blok Vari dan End Vari.
Tabel Informasi Tabel infromasi atau tabel simbol dibuat guna
mempermudah pembuatan dan implementasi dari semantyc analyzer.
Tabel simbol ini mempunyai dua fungsi penting dalam proses
translasi, yaitu :
1. Untuk membantu pemeriksaaan kebenaran semantik dari program
sumber. 2. Untuk membantu dan mempermudah dalam pembuatan
intermediate code dan
proses pembangkitan kode.
-
78
Hal tersebut dilakukan dengan menambah dan mengambil atribut
variabel yang dipergunakan pada program dari tabel. Atribut
tersebut, seperti nama, tipe, ukuran
variabel bisa ditemukan secara eksplisit pada deklarasi, atau
secara implisit berdasarkan konteks kemunculan nama variabel pada
program.
Beberapa jenis dari tabel informasi adalah sebagai berikut. 1.
Tabel identifier : berfungsi menampung semua identifier yang
terdapat dalam
program. Identifier yang dimaksud dapat berupa prosedur, fungsi,
tipe, variabel,
dan konstanta. 2. Tabel Array : Berfungsi untuk menampung
informasi tambahan untuk sebuah
array. Tabel Array memiliki Field : - Tipe elemen Array
- Indeks batas atas array - Indeks batas bawah array
3. Tabel Blok : Mencatat variabel variabel yang ada pada blok
yang sama Variabel yang dimaksud termasuk variabel pada blok atau
procedure maupun
parameter pada suatu blok atau procedure. Contoh : Program
A;
Var B:Integer;
Procedure X (Z:Char); Var C:Integer;
Begin
Maka untuk blok program A Variabel yang ada adalah B dengan tipe
data integer
Sedangkan untuk blok procedure X Parameter yang ada adalah Z
dengan tipe data Char Variabel yang ada adalah C dengan tipe data
integer
4. Tabel Real : Menyimpan elemen tabel yang bernilai Real 5.
Tabel String : Menyimpan informasi String 6. Tabel Display :
Mencatat Blok yang aktif.
-
79
Berikut ini adalah contoh untuk mengisikan suatu variabel ke
dalam tabel Identifier. (Catatan : dalam implementasi pengisian
tabel identifier bisa diisikan gabung, apakah itu variabel,
konstanta, dll, ataupun diisikan pisah, seperti tabel identifier
khusus untuk variabel, konstanta, dll)
Uses Crt;
Var
BerkasTeks : Text;
teks:text;
kode,tvari,karb:string; {untuk menampung kode} kodeb:string;
{untuk menampung huruf besar dari kode} arkode : array [1..100] of
string; {untuk menampung kode dalam {huruf besar}
l,I,o,n,j,posisi1,posisi2,pkar,k : byte; cekvar:string;
variabel1:string; {untuk menampung bagian dklarasi variabel}
posisi:integer;
arvari:array[1..25] of string; kar:array[1..25] of string;
vari:array[1..25] of string; Begin
n:=1;
i:=1;
k:=1;
o:=1;
Assign ( berkasteks,'c:\variabel.dat'); Reset ( berkasteks);
Clrscr;
While not EOF ( berkasteks ) do Begin
Readln( berkasteks,kode); for j:=1 to length(kode) do
kodeb:=kodeb+upcase(kode[j]); arkode[i]:=kodeb; n:=n+1;
i:=i+1;
kodeb:='';
end;
-
80
close ( BerkasTeks );
for i:=1 to n-1 do
begin
if arkode[i]='VARI' then posisi1:=i;
if arkode[i]='END VARI' then posisi2:=i;
end;
for I:=posisi1+1 to posisi2-1 do
begin
cekvar:=arkode[i]; for j:=1 to length(cekvar) do begin
if cekvar[j]=':' then posisi:=j; end;
for j:=1 to posisi-1 do variabel1:=variabel1+cekvar[j];
arvari[o]:=variabel1; variabel1:='';
o:=o+1;
end;
pkar:=1;
karb:='';
l:=1;
for i:=1 to o-1 do
begin
tvari:=tvari+arvari[i]; tvari:=tvari+',';
end;
writeln(tvari);
for j:=1 to length(tvari) do begin
if tvari[j]','then begin
karb:=karb+tvari[j]; end
-
81
else if (tvari[j]=',') then Begin
kar[pkar]:=karb; karb:='';
pkar:=pkar+1;
end;
end;
for i:=1 to pkar-1 do
begin
write('variabel ke- ',i,' adalah ',kar[i]); writeln;
end;
karb:='';
Assign ( teks,'C:\tabel.dat'); rewrite(teks); for i:=1 to pkar-1
do
begin
karb:=kar[i]; writeln(teks,karb); karb:='';
end;
close(teks); readln;
end.
Teknik Optimasi Tahapan optimasi kode bertujuan untuk
menghasilkan kode program yang berukuran lebih kecil dan lebih
cepat eksekusinya. Berdasarkan ketergantungannya pada mesin,
optimasi dibagi menjadi : 1. Machine Dependent Optimizer
Kode dioptimasi sehingga lebih efisien pada mesin tertentu.
Optimasi ini
memerlukan informasi mengenai feature yang ada pada mesin
tujua