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.
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.
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).
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 <= "Z") Or (d >= "a" And d <= "z") Then
Debug.Print "Huruf"
Else
Debug.Print "Bukan Huruf"
End If
Next i
End Sub
Atau, cara lain :
Private Sub Form_Load()
a = InputBox("Masukkan Input:") For i = 1 To Len(a)
d = Mid(a, i, 1)
If (Asc(d) >= Asc("A") And Asc(d) <= Asc("Z")) Or (Asc(d) >= Asc("a") And Asc(d) <= Asc("z")) Then
Debug.Print "Huruf"
Else
Debug.Print "Bukan Huruf"
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)) or
((ekspresi[i]>=#97) and (ekspresi[i]<=#122)) then writeln('Huruf')
else
end.
end;
readln;
writeln('Bukan Huruf');
Dengan menggunakan bahasa C :
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
void main()
{
clrscr();
char ekspresi[100];
int i;
printf("Masukkan Ekspresi:"); scanf("%s",&ekspresi); for(i=0;i<strlen(ekspresi);i++)
{
if (isalpha(ekspresi[i]))
printf("Adalah huruf\n");
else
printf("Bukan Huruf\n");
}
getch();
}
Versi II :
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
clrscr();
char ekspresi[100];
int kar;
int i;
printf("Masukkan Ekspresi:"); scanf("%s",&ekspresi); for(i=0;i<strlen(ekspresi);i++)
{
kar=ekspresi[i];
if (((kar>=65) && (kar<=90)) || ((kar>=97) && (kar<=122)))
printf("Adalah huruf\n");
else
printf("Bukan Huruf\n");
}
getch();
}
Mengenali Angka pada Suatu Input
Private Sub Form_Load() Debug.Print "--------------"
a = InputBox("Masukkan Input:")
For i = 1 To Len(a)
d = Mid(a, i, 1)
If (Asc(d) >= Asc("0") And Asc(d) <= Asc("9")) Then
Debug.Print "Angka"
Else
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 <= "9") Then
Debug.Print "Angka"
Else
Debug.Print "Bukan Angka"
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]>=#48) and (ekspresi[i]<=#57))then writeln('Angka')
else
end.
end;
readln;
writeln('Bukan Angka');
Dengan menggunakan Bahasa C :
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
void main()
{
clrscr();
char ekspresi[100];
int i;
printf("Masukkan Ekspresi:"); scanf("%s",&ekspresi); for(i=0;i<strlen(ekspresi);i++)
{
if (isdigit(ekspresi[i]))
printf("Angka\n");
else
printf("Bukan Angka\n");
}
getch();
}
Versi :
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
clrscr();
char ekspresi[100];
int kar;
int i;
printf("Masukkan Ekspresi:"); scanf("%s",&ekspresi); for(i=0;i<strlen(ekspresi);i++)
{
kar=ekspresi[i];
if ((kar>=48) && (kar<=57))
printf("Angka\n");
else
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 :
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
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;
end else begin
end;
tampung:=tampung+ekspresi[i];
flag:=false
end.
writeln(tampung);
readln;
Dengan menggunakan Bahasa C :
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
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<strlen(ekspresi);i++)
{
if (ekspresi[i]==' ')
{
if (flag==0)
{
kalimat[hitung]=ekspresi[i];
hitung=hitung+1;
}
flag=1;
}
else
{
kalimat[hitung]=ekspresi[i];
hitung=hitung+1;
flag=0;
}
}
for(i=0;i<hitung;i++)
printf("%c",kalimat[i]);
getch();
}
Pemakaian Procedure
1. Pada Pascal
Pada Pascal pengiriman parameter dapat dilakukan dengan dua cara yaitu :
a. Pengiriman parameter secara nilai
Jika nilai parameter pada prosedur diubah tidak akan mempengaruhi nilai parameter nyata.
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
end;
var
c:=a+b;
writeln('Nilai c = ',c);
end.
write('Masukkan Nilai X :');
readln(x);
write('Masukkan Nilai Y :');
readln(y); hitung(x,y); readln;
Contoh pengiriman parameter secara acuan :
uses crt;
procedure hitung(var a,b:integer);
var
c:integer;
begin
end;
var
a:=10;
c:=a+b;
writeln('Nilai c = ',c);
x,y:integer;
begin
write('Masukkan Nilai X :');
readln(x);
write('Masukkan Nilai Y :');
readln(y);
end.
hitung(x,y);
writeln('Nilai variabel x=',x);
readln;
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 <stdio.h>
# include <conio.h>
void hitung(int panjang,int lebar);
void main()
{
int a,b;
clrscr();
printf("Masukkan Panjang :");
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
end.
writeln(garis); writeln('Pascal'); writeln(garis); readln;
2. Fungsi dengan Parameter
uses crt;
function luas(panjang,lebar:integer):integer;
begin
end;
var
end.
write('Masukkan Panjang :');
readln(p);
write('Masukkan Lebar :'); readln(l); writeln('Luas=',luas(p,l)); readln;
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 <stdio.h>
# include <conio.h>
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;
}