BAB IV ANALISIS DAN PERANCANGAN PERANGKAT LUNAK Bab ini membahas analisis perancangan perangkat lunak (diberi nama c2p) dari segi struktur data dan analisis aliran data. Hal-hal yang dibahas diantaranya adalah perancangan struktur data untuk sistem representasi tipe dan tabel simbol, perancangan antar muka dan perintah, analisis modul program serta analisis aliran data dengan DFD (Data Flow Diagram).
4.1
Analisis Aliran Data Upa bab ini membahas analisis aliran data dengan menggunakan DFD. Diagram DFD
pada upa bab ini tidak menampilkan proses dan aliran data yang berhubungan dengan penganalisis leksikal dan sintaksis, karena keduanya ditangani secara otomatis oleh kakas. Diagram Aliran Data yang dicakup oleh upa bab ini hanya sampai pada level 2. 4.1.1
Diagram level 0
Gambar IV-1 diagram DFD level 0
Diagram level 0 ( gambar IV-1 ) menampilkan program sebagai suatu proses yang berkomunikasi dengan entitas user. Keterangan mengenai aliran data dan proses dapat dilihat pada tabel IV-1. Tabel IV-1 keterangan entitas dan proses untuk level 0
entitas / data / proses user Proses translasi
Keterangan Entitas luar yang memberikan masukan berupa berkas Proses / task yang dikerjakan oleh aplikasi c2p
50
51
Lanjutan Tabel IV-1 Entitas/prose
Keterangan Berkas masukan yang akan diterjemahkan oleh aplikasi Berkas keluaran hasil penerjemahan aplikasi
Berkas C Berkas Pascal
4.1.2
Diagram level 1 2.0
Analisis sintaksis
Tabel simbol
identifier
Atribut Token
Pohon Parsing Kode C
Pembangkitan kode Kode Pascal
Analisis leksikal
3.0
1.0 Gambar IV-2 Diagram DFD level 1
Diagram pada level ini (ditampilkan pada gambar IV-2) menggambarkan semua proses utama dalam program. Keterangan tentang masing-masing proses dapat dilihat pada tabel IV-2 Tabel IV-2 keterangan DFD level 1
entitas / data / proses Analisis leksikal Analisis sintaksis Pembangkitan kode Kode C Token Identifier Atribut
Keterangan mengidentifikasi token dari kode sumber ( dilakukan oleh kakas FLEX) Mengidentifikasi rule untuk grammar dan melaporkan jika terjadi kesalahan sintaksis Menerjemahkan kode Pascal dari pohon parsing ( AST ) yang telah dibangun oleh proses analisis sintaksis. Bagian dari berkas masukan yang Komponen parsing yang dikenali oleh penganalisis sintaksis Semua obyek / simbol pada kode sumber yang disimpan ke tabel simbol Atribut obyek identifier yang di-update oleh proses pembangkitan kode
52
Lanjutan Tabel IV-2 Entitas/proses Kode Pascal Pohon parsing
4.1.3
Keterangan Kode hasil proses translasi AST yang dihasilkan oleh proses analisis sintaksis
Diagram Level 2 Proses 3
Gambar IV-3 Diagram DFD level 2 proses 3
Aliran data pada level ini tidak memiliki percabangan ( gambar IV-3 ), dan hanya melewati dua upa proses utama yaitu : Mengaplikasikan aturan terjemahan dan mencetak kode, dapat dilihat pada tabel IV-4 Tabel IV-3 Proses pembangkitan kode
entitas / data / proses Apply rule Cetak kode Pohon parsing Kode Pascal Atribut
4.2
Keterangan Mengaplikasikan aturan terjemahan sesuai berkas masukan Cetak kode hasil translasi ke berkas temporer AST hasil dari proses analisis sintaksis Kode Pascal hasil translasi Atribut dari obyek program yang diterjemahkan
Analisis Modul Telah diuraikan pada bab I bahwa struktur program translator sangat mirip dengan
kompilator, hal ini mempengaruhi desain modul pada program translator. Program dibagi menjadi empat modul utama, yaitu Penganalisis leksikal dan sintaksis (yang ditangani oleh kakas), struktur data internal (yang terdiri dari tiga submodul mayor) dan Pembangkit kode. Struktur modul program secara keseluruhan dapat dilihat pada gambar IV-1
53
Gambar IV-4 Struktur modul program
Penjelasan masing-masing modul ditampilkan pada tabel IV-5 Tabel IV-4 Penjelasan modul
Modul Penganalisis leksikal ( ditangani kakas )
Keterangan Membaca berkas masukan (fungsi input), mengenali token. Di-generate dengan kakas FLEX
Penganalisis sintaksis ( ditangani kakas )
Melakukan parsing kode sumber, membangun pohon parsing
Tabel simbol
Manajemen obyek/simbol
Sistem tipe
Representasi tipe dari identifier
AST
Representasi pohon parsing
Pembangkit kode
Melakukan
translasi,
menerapkan
aturan
translasi, fungsi output (menulis hasil translasi ke berkas keluaran)
54
4.3
Perancangan Struktur Data Upa bab ini dibatasi hanya membahas rancangan struktur data global yang paling banyak
digunakan dalam proses pembangunan perangkat lunak, diantaranya adalah sistem representasi tipe ( declarator dan specifier ), tabel simbol dan AST (Abstract Syntax Tree). 4.3.1
Specifier dan Declarator Pemrosesan deklarasi bahasa C yang paling sederhana, paling tidak membutuhkan dua
unit pemroses yang berfungsi merepresentasikan tipe pada saat suatu obyek dideklarasikan. Unit ini disebut sebagai specifier dan deklarator [HOL92]. Specifier dan declarator bersama dengan simbol, membentuk sistem representasi tipe. Simbol merupakan setiap identifier atau obyek program yang ada dalam kode sumber. Sedangkan specifier menyatakan tipe dari obyek tersebut. Terakhir adalah declarator, berfungsi sebagai modifier (memungkinkan suatu obyek dikombinasi menjadi tipe-tipe yang tidak terbatas jumlahnya : misal pointer to function, function to pointer, array of pointer, pointer to array of , dll.), sehingga obyek dapat dikenali sebagai fungsi, senarai atau pointer. Misal deklarasi variabel sebagai berikut :
int x ; maka deklarasi variabel diatas dapat diuraikan menjadi tiga bagian , yaitu : a. Simbol : pada deklarasi diatas simbol adalah variabel ‘x’ b. Specifier : pada deklarsi diatas, simbol x dinyatakan bertipe integer. Jadi specifier-nya adalah int c. Declarator : deklarasi diatas tidak menggunakan declarator. Apabila deklarasi diatas diubah menjadi :
int x[ 10 ]; maka deklarator-nya menjadi senarai, dengan jumlah elemen 10.
Specifier Specifier berfungsi menjelaskan tipe data dari obyek yang dideklarasikan. misal : int, char, float, void, union, struct, enum, dll. Specifier pada C diterjemahkan secara straight-forward ke dalam Pascal sebagai berikut :
55
a. float
=
REAL
b. int
=
INTEGER
c. char
=
CHAR
d. struct{...}
=
RECORD...END
e. typedef...
=
TYPE...
f. union
= sama dengan RECORD
g. void ( fungsi yang menjadi prosedur ) = PROCEDURE h. tipe data selain void, ketika menjadi nilai kembalian suatu fungsi pada C mengindikasikan
bahwa
obyek
tersebut
diterjemahkan
menjadi
FUNCTION pada Pascal. i. enum t { ONE = 1, TWO, THREE } diterjemahkan menjadi CONST
ONE = 1; TWO = 2; THREE = 3;
deklarasi obyek tanpa specifier pada ANSI C adalah valid, karena otomatis obyek akan dianggap sebagai integer. Namun, karena implementasi grammar C yang dipakai pada tugas akhir ini tidak memungkinkan deklarasi tanpa specifier, program akan memberi pesan kesalahan pada deklarasi obyek tanpa specifier.
Declarator Declarator memungkinkan suatu obyek dikenali sebagai pointer, senarai atau fungsi. Declarator tidak selalu harus ada pada setiap deklarasi. Deklarasi tanpa declarator menunjukkan bahwa obyek adalah variabel biasa. a. Pointer : obyek pointer pada C akan dikonversi menjadi array pada Pascal. b. Senarai : obyek senarai pada C dikonversi menjadi array pada Pascal, dengan indeks akses dimulai dari 0. Obyek array yang diinisialisasi, harus dikonversi dengan menghitung kapasitas senarai, sebagaimana ditampilkan pada tabel Tabel IV-5 Senarai pada C dan Pascal
C char hello[]="helloworld";
...
Pascal var hello:STRING[10]; BEGIN hello:=CONCAT('helloworld',nullstr); ....
56
fungsi pada C diterjemahkan ke Pascal menjadi procedure atau function tergantung pada tipe data kembalian dari fungsi. Jika tipe kembalian fungsi adalah void, fungsi diterjemahkan menjadi procedure. Namun jika tipe kembalian adalah selain void, fungsi diterjemahkan menjadi function. 4.3.2
Representasi Tipe Sistem yang merepresentasikan tipe diimplementasikan sebagai list berkait. Elemen dari
list berkait ini ada dua jenis : yaitu specifier dan declarator. Specifier merupakan struktur yang merepresentasikan tipe simbol, misal int,
float,
double,
char,
short,
struct, dll sebagaimana telah dijelaskan di atas. Declarator merupakan modifier, sehingga suatu simbol dapat dikenali sebagai fungsi, senarai, atau pointer. Contoh representasi tipe untuk kode berikut ini adalah char i ;
simbol name
specifier
i
type
char
etype
int *h [ 37 ];
/*array of pointer*/
simbol name
declarator
h
array 37 elemen
type etype
declarator
specifier
pointer
int
declarator
specifier
array 31 elemen
float
float (*v)[ 31 ]; /*pointer to array*/
simbol name type etype
v
declarator pointer
Gambar IV-5 Representasi tipe
57
Dari gambar diatas, dapat dilihat bahwa dalam satu list yang merepresentasikan tipe, harus ada tepat satu specifier. Sedangkan untuk declarator, boleh ada lebih dari satu declarator atau juga boleh tidak ada sama sekali declarator.
4.3.3
Implementasi Tabel Simbol Tabel simbol yang diimplementasikan dalam tugas akhir ini adalah hash-based symbol
table. Karena berbasis hash, tabel simbol akan menggunakan tabel dan fungsi hash. Mengenai detil dan implementasi tabel dan fungsi hash dapat dilihat pada kode sumber aplikasi : hashtab.h dan hashtab.c Tabel simbol didesain sebagai tabel hash yang menyimpan pointer ke suatu linked list, yaitu collision chain. Elemen dari linked list ini disebut sebagai simbol. Masing-masing elemen (simbol) memiliki nama dan pointer yang menunjuk ke sistem list yang merepresentasikan tipe (dibahas pada subbab sebelumnya). Collision chain berfungsi menangani kasus dimana dua atau lebih simbol memiliki nilai hasil evaluasi fungsi hash yang sama. Collision chain diimplementasikan sebagai list berkait dengan satu pointer ke depan dan satu pointer ke belakang ( next dan previous ). Linked list diatur oleh fungsi manajemen tabel hash. Struktur lain yang membuat pointer ke linked list adalah cross link, penjelasan mengenai cross link dapat ditemukan pada upabab berikutnya. Berikut ini adalah potongan kode dalam bahasa C, masing-masing simbol dalam kode ini akan disimpan dalam tabel simbol dengan representasi pada gambar III-2
int i; loving( h, v ) { int a ; while ( condition ) { int l, a; } }
58
Cross link
Hash table i
loving
a
a
h
v
l
Gambar IV-6 Tabel simbol
Cross link adalah struktur yang dipakai untuk menelusuri semua simbol dalam suatu level. Pada kode diatas, simbol i dan loving berada pada level paling luar , maka kedua simbol ditunjuk oleh cross link yang sama, yaitu cross link pertama. Berikutnya adalah simbol h, v dan a, ketiganya berada level kedua, maka ketiganya ditunjuk oleh cross link kedua. Seperti itu seterusnya. Perlu dicatat bahwa pada kode diatas, ada dua simbol dengan nama yang sama, yaitu variabel a, namun masing-masing dideklarasikan pada level yang berbeda, sehingga merupakan dua simbol yang berbeda. Poin penting berikutnya adalah bahwa simbol a dan h memiliki nilai hash yang sama ( nilai hash dihitung oleh fungsi hash ) sehingga ketiganya ( 2 simbol a + 1 simbol h ) dikelompokkan dalam list berkait yang sama.
59
4.3.4
Elemen tabel simbol Elemen tabel simbol diatur oleh dua tabel, tabel pertama adalah tabel hash, sedangkan
tabel kedua adalah tabel simbol itu sendiri.
simbol berikutnya (next)
simbol sebelumnya (prev)
prev next name rname level type Sistem yang merepresentasikan tipe
etype args
List obyek merepresentasikan parameter ( pada kasus simbol adalah function ).
next
simbol berikutnya dalam satu level ( cross link )
Gambar IV-7 Struktur item tabel simbol
prev, next : diatur oleh sistem hash ( fungsi hash dan tabel hash ). Sisa elemen berikutnya diatur oleh tabel simbol. Prev merupakan pointer ke simbol sebelumnya dalam tabel hash. Sedangkan pointer next, menunjuk ke simbol berikutnya. name, rname : nama simbol. level : menyatakan tingkatan level bersarang. type, etype : merupakan pointer ke representasi tipe. Tipe dalam tabel simbol direpresentasikan sebagai linked-list ( dibahas pada subbab representasi tipe ).
60
4.3.5
Struktur tabel simbol Struktur simbol tabel secara fungsional adalah sebagai berikut :
a. Pengalokasi memori Tabel simbol membutuhkan ruang di memori untuk menyimpan semua referensi obyek yang ada di dalam kode sumber. Pengalokasi memori memungkinkan semua referensi yang dimaksud disimpan dalam memori. b. Kalkulasi fungsi hash Kalkulasi dilakukan ketika sistem melakukan pencarian suatu obyek. Apabila obyek ditemukan, maka sistem kemungkinan masih melakukan iterasi dalam list, untuk mencari item informasi yang dicari, karena tabel simbol di sini berupa table of linked list. Fungsi hash yang dipakai pada tabel simbol diambil dari [GRU00] c. Dealokasi memori Dealokasi dipakai untuk menghapus referensi suatu obyek pada kode sumber dari memori. Tabel simbol seringkali menghapus obyek-obyek yang sudah tidak dipakai dalam kode sumber, misal ketika melewati akhir suatu blok atau badan suatu fungsi. d. Fungsi pembanding string Pembanding string dipakai untuk menentukan suatu item string di tabel simbol cocok dengan yang dicari atau tidak. e. Struct dan simbol Obyek yang didefinisikan dengan keyword struct dibedakan dari obyek lainnya, dengan pertimbangan karena obyek struct memiliki beberapa item informasi. Termasuk juga dalam struct adalah semua simbol yang dideklarasikan dengan kata kunci union. 4.3.6
AST ( Abstract Syntax Tree ) Struktur data AST digunakan untuk memproses ekspresi dan merupakan representasi
internal dari pohon parsing. Setiap ekspresi dalam bahasa C direpresentasikan dengan AST, kemudian diterjemahkan menjadi ekspresi Pascal dengan cara penelusuran (traversal) tiap simpul. Pada tugas akhir ini, AST diimplementasikan sebagai pohon biner.
61
Struktur AST
Gambar IV-4 menunjukkan struktur dari AST. Beberapa komponen dari AST dapat dijelaskan sebagai berikut :
info
Simpul
data
parent
pointer parent & sibling Simpul
pointer left &
sibling right
Simpul Right child Simpul Left child Gambar IV-8 Stuktur AST
info : menunjukkan kode komponen parsing yang diwakili oleh simpul AST ( misal operator PLUS, MINUS, DIV, STAR , atau obyek seperti identifier, konstanta integer, dan komponen parsing lainnya ). data : menyimpan nilai dari komponen parsing, misal suatu simpul AST mewakili konstanta integer, maka data mungkin menyimpan nilai 0, 3, 4, dst. Hal yang sama berlaku juga untuk komponen parsing lain. Pointer sibling, left, & right : merupakan pointer yang menunjuk ke simpul AST lainnya. Simpul left dan right menunjuk ke simpul anak yang berada pada level berikutnya, sedangkan simpul sibling menunjuk ke saudara dalam satu level.
62
4.4
Perancangan Antarmuka dan Perintah Program yang dikembangkan pada tugas akhir ini berbasis console, sehingga semua
interaksi dengan user dilakukan lewat teks perintah. Pesan untuk kesalahan yang ada dalam berkas masukan atau kegagalan proses translasi juga ditampilkan pada layar console. Berkas keluaran dari program selalu memiliki nama yang sama dengan berkas masukan, yang berbeda hanya ekstensi. Misal berkas masukan adalah tes.c maka berkas keluaran yang dihasilkan adalah tes.pas . Program hanya menerima berkas masukan yang berekstensi .C , ekstensi lainnya akan ditolak. Contoh eksekusi pemanggilan program pada console dapat dilihat pada gambar IV-6
Gambar IV-9 Pemanggilan program dari console
Berikut adalah format perintah pemanggilan program : c2p
arg.c
c2p = adalah nama program translator arg.c = adalah nama berkas masukan