BAB III ANALISIS PEMECAHAN MASALAH Bab ini akan membahas analisis terhadap masalah yang di sebutkan dalam upabab rumusan masalah, yang ada pada Bab I. Upabab ini mengkaji urutan tahapan analisis pemecahan salah menjadi sejumlah langkah logis dan runut. Hal-hal yang dibahas meliputi : deskripsi alur kerja global, sekilas grammar bahasa C, penjelasan proses parsing, konfigurasi kakas, dan proses konversi.
3.1
Alur Kerja Global Spesifikasi
Spesifikasi
token C
grammar C
pembangkitan parser
pembangkitan scanner
Scanner
Parser bahasa
bahasa C
C
pembangkitan AST
Pembangkitan tabel simbol
Pembangkitan kode
dan sistem representasi tipe
bahasa Pascal
Gambar III-1 Alur Kerja Global
31
32
Gambar III-1 menggambarkan alur kerja utama dalam pengerjaan tugas akhir ini. Proses pertama dimulai dengan mengkaji grammar bahasa C. Tahapan dalam proses ini meliputi membuat berkas konfigurasi kakas dan membuat kode yang menangani reduksi suatu rule pada grammar. Akhir dari proses ini adalah menggunakan program Yacc dan Flex untuk menghasilkan parser serta scanner bahasa C. Proses kedua adalah membuat tabel simbol untuk menyimpan semua simbol yang diproses dalam kode sumber. Tahapan ini meliputi proses : pembuatan fungsi hash, pembuatan struktur data tabel simbol, membuat rutin-rutin untuk manajemen alokasi memori di tabel simbol, dll. Pekerjaan lain dalam tahap ini adalah membuat sistem representasi tipe, sehingga setiap simbol dalam tabel simbol dapat dikenali dengan tipe tertentu. Tahap ketiga ( tahap terakhir ) adalah melakukan analisis proses translasi dari bahasa C ke Pascal. Hal-hal yang menjadi fokus adalah penanganan simbol antara C dan Pascal, misal C case sensitive sedangkan Pascal tidak case sensitive, ini berarti dua simbol dalam bahasa C yang tidak menimbulkan error saat kompilasi, mungkin akan menjadi error ketika dibawa ke Pascal. Isu lain adalah konversi tipe, yaitu bagaimana program mengkonversi tipe suatu simbol di C menjadi tipe Pascal yang valid, misal bagaimana mengkonversi senarai di C ke Pascal, bagaimana storage class di C seperti extern, static, auto dan register, diubah ke dalam sistem Pascal.
3.2
Spesifikasi Grammar Bahasa C Spesifikasi grammar bahasa C yang dipakai dalam analisis pada subbab ini diambil dari
[HOL92]. Grammar ini menerima input ANSI C. Untuk lebih memudahkan penjelasan dan penulisan, proses parsing yang bottom-up ini akan dijelaskan dengan cara top-down. Dimulai dari rule paling atas yaitu menerjemahkan program sebagai list yang terdiri dari satu atau lebih unit translasi. Unit translasi terdiri dari satu atau lebih deklarasi eksternal. Deklarasi eksternal yaitu semua deklarasi simbol atau identifier di C, misal deklarasi variabel dan deklarasi fungsi. Deklarasi eksternal bila diuraikan lagi, akan terdiri dari optional specifier dan satu atau lebih declarator. Grammar dan penjelasannya dapat dilihat pada tabel III-1. Pembahasan pada upabab ini hanya dilakukan untuk hal-hal yang penting dan mendasar saja, mengingat banyaknya aturan.
Tabel III-1 Spesifikasi Grammar
No
Rule
Penjelasan
1
program : ext_def_list;
Program dalam bahasa C diterjemahkan sebagai int c; list dari external definition of symbol (dalam hal int foo(); ini adalah ext_def_list ). Jadi, program dalam C adalah serangkaian definisi simbol/obyek void bar() { } program, yaitu variabel dan subrutin.
2
ext_def_list : ext_def_list ext_def ;
ext_def_list adalah suatu list rekursif kiri yang terdiri dari satu deklarasi eksternal (ext_def) atau lebih. Aturan kosong pada baris kedua, digunakan untuk melakukan inisialisasi saat parsing pertama kali dilakukan.
3
ext_def : opt_specifier ext_decl_list opt_specifier SEMI | opt_specifier funct_decl compound_stmt ;
4
Contoh
ext_def adalah serangkaian deklarasi simbol int c; SEMI | dengan tipe specifier tertentu. Ext_def merupakan void bar() { } aturan produksi untuk kasus deklarasi suatu variabel atau subrutin. Deklarasi variabel dan def_list subrutin ditangani oleh aturan pertama, yaitu dengan ext_decl_list. Sedangkan aturan ketiga menangani definisi fungsi (definisi, bukan deklarasi)
ext_decl_list : ext_decl |
ext_decl_list adalah suatu list rekursif kiri dari Foo, bar ext_decl
ext_decl_list COMMA ext_decl ; 5
ext_decl : var_decl | var_decl EQUAL initializer | funct_decl ;
ext_decl berfungsi melakukan enkapsulasi dari i = 5 dua tipe deklarasi, yaitu deklarasi variabel biasa a[3] = { 1 , 2, 3 } dan deklarasi subrutin. Aturan kedua dari produksi diatas berfungsi menangani deklarasi variabel foo( int b ) dengan inisialisasi-nya. 33
Lanjutan tabel III-1 No
Rule
Penjelasan
Contoh
6
opt_specifier : CLASS TTYPE | TTYPE | opt_specifier berfungsi melakukan enkapsulasi static int specifiers ; antara tipe bentukan (TTYPE) dengan specifiers point yang merupakan tipe default dari C. CLASS adalah simbol terminal yang menyatakan storage extern point class ( auto, extern, static , typedef,atau register).
7
specifiers : type_or_class | specifiers Specifiers merupakan list rekursif kiri dari static int type_or_class; type_or_class. List ini memungkinkan deklarasi extern double variabel dengan tipe default sebagai kombinasi antara tipe dengan storage class. Misal : static int, extern char, register int,dll.
8
type_or_class : type_specifier | CLASS ;
9
type_specifier : TYPE | enum_specifier | type_specifier berfungsi melakukan enkapsulasi int struct_specifier; dari tiga tipe dasar, yaitu TYPE (simbol terminal struct point untuk tipe default, TYPE melakukan reduksi dari token int, char, float, double, dll ), enum_specifier enum E1 ( dibahas lebih lanjut pada upabab proses parsing ) dan struct_specifier ( juga dibahas pada upabab proses parsing ).
10
var_decl : new_name | var_decl LP RP | var_decl LP var_list RP | var_decl LB RB | var_decl LB const_expr RB| STAR var_decl | LP var_decl RP ;
type_or_class berfungsi melakukan enkapsulasi int antara storage class dengan type_specifier. static
Aturan produksi var_decl menangani deklarasi Arr variabel dengan melakukan reduksi dari nama Foo() variabel dan kombinasinya dengan penambahan ‘(‘ LP Left Parenthesis , ‘)’ RP Right Parenthesis, Bar( int i, int j ) ‘[‘ LB Left Bracket , ‘ ] ‘ RB Right Bracket , dan ‘*’ STAR. const_expr digunakan untuk menangani deklarasi senarai, karena itu const_expr adalah ekspresi untuk nilai konstan. 34
Lanjutan tabel III-1 No
Rule
Penjelasan
11
Funct_decl : new_name LP RP | new_name LP name_list RP| new_name LP var_list RP| STAR funct_decl| funct_decl LB RB | funct_decl LB const_expr RB| funct_decl LP RP | LP funct_decl RP ;
12
Name_list : new_name new_name ;
13
var_list : param_declaration | var_list Pembahasan deklarasi variabel dicukupkan hanya COMMA param_declaration: sampai pada aturan produksi ini, karena akan membutuhkan terlalu banyak ruang. Var_list adalah aturan produksi yang menangani deklarasi parameter fungsi. Parameter suatu fungsi adalah list dari deklarasi simbol yang berupa param_declaration dipisahkan dengan koma. Param_declaration adalah variabel atau fungsi
Contoh
Aturan produksi funct_decl digunakan untuk Foo() menangani deklarasi fungsi. Deklarasi fungsi Bar( int i, int j ) dilakukan dengan mereduksi dari new_name ( yang menangani reduksi untuk nama fungsi ), lalu mencocokkan dengan LP ‘(‘ dan RP ‘)’. Kasus ini untuk deklarasi fungsi tanpa argumen. Produksi nomor dua dipakai untuk menangani deklarasi fungsi dengan nama argumen saja, tanpa tipe. Sedangkan aturan nomor tiga dipakai untuk deklarasi argumen lengkap dengan nama dan tipenya. Aturan produksi nomor empat untuk mereduksi fungsi yang mengembalikan pointer. Aturan produksi berikutnya menangani fungsi yang mengembalikan senarai.
| name_list Aturan produksi name_list melakukan reduksi untuk argumen fungsi. name_list adalah suatu list rekursif kiri dengan elemen berupa new_name. ( new_name mereduksi dari nama fungsi yang diambil dari simbol terminal NAME ).
35
36
3.3
Proses Parsing Proses parsing merupakan proses inti dalam aplikasi ini, karena pada saat grammar di-
parsing, terjadi reduksi rule dan parser memanggil bagian action, yaitu bagian yang membangun tabel simbol dan sistem representasi tipe. Proses parsing dapat dibagi menjadi tiga besar upabagian, yaitu deklarasi, ekspresi dan statement. Deklarasi Proses parsing deklarasi variabel dan fungsi telah dijelaskan pada upa bab sebelumnya. Deklarasi yang dibahas yang dibahas pada upabab ini adalah deklarasi struktur, deklarasi enumerasi dan definisi fungsi. Proses parsing deklarasi struktur dapat dilihat pada Tabel III-2 Pemrosesan deklarasi strukturTabel III-1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi, untuk pemrosesan deklarasi enumerasi dapat dilihat pada Tabel III-3 sedangkan untuk pemrosesan definisi fungsi dapat dilihat pada Tabel III-4. Pemrosesan Ekspresi Ekspresi adalah komponen parsing yang mengevaluasi nilai suatu variabel atau mengeksekusi blok / badan suatu subrutin. Karena itu, pemrosesan ekspresi selalu melibatkan penanganan nilai variabel sementara / temporer. Pada program kompilator yang menerjemahkan kode dari C ke bahasa aras rendah seperti assembly (bahasa rakitan) atau C-Code , manajemen variabel temporer merupakan masalah yang cukup kompleks. Tugas akhir ini menerjemahkan bahasa C ke bahasa lain dengan level yang sama, sehingga masalah manajemen variabel temporer dapat diabaikan. Ekspresi dibagi menjadi dua upa bagian, yaitu non_comma_expr dan expr. non_comma_expr adalah tipe ekspresi yang menerima semua jenis ekspresi kecuali ekspresi yang menggunakan koma sebagai operatornya. Pembedaan jenis ekspresi ini lebih disebabkan karena faktor gramatikal dari rancangan grammar [HOL92]. Tabel III-5 memperlihatkan pemrosesan ekspresi pada bahasa C.
Tabel III-2 Pemrosesan Deklarasi Struktur
No
Rule
Penjelasan
Contoh
1
struct_specifier : STRUCT opt_tag LC Aturan produksi diatas mereduksi deklarasi struct. struct point def_list RC | STRUCT tag; STRUCT merupakan simbol terminal untuk kata { int x, y; } p; kunci struct, opt_tag menangani deklarasi struct dengan nama tag, def_list mereduksi list yang berisi item-item informasi pada badan struktur. Opt_tag bersifat optional
2
opt_tag : tag | /*empty*/ ;
3 4
tag : NAME ; def_list : def_list def | /*empty*/;
5
def : specifiers decl_list SEMI | specifiers SEMI ;
6
decl_list : decl | decl_list COMMA decl ;
7
Karena opt_tag bersifat optional, maka aturan kedua struct { merepresentasikan hal tersebut, yaitu penggunaan int x, y; } p1; aturan kosong. tag melakukan reduksi langsung dari simbol terminal NAME. def_list mirip dengan ext_def_list yang telah diuraikan pada Tabel III-1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi baris ke tiga Def juga serupa dengan ext_def yang telah diuraikan pada Tabel III-1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi baris ke lima. Def berisi item informasi yang ada dalam struktur. decl_list juga serupa dengan ext_decl_list diuraikan d, e, foo, bar pada Tabel III-1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi baris ke tujuh
decl : funct_decl | var_decl | var_decl decl juga serupa dengan ext_decl yang telah EQUAL initializer | var_decl COLON diuraikan pada Tabel III-1 Spesifikasi grammar const_expr | COLON const_expr; untuk proses parsing deklarasi variabel dan fungsi baris ke 11 37
Tabel III-3 Pemrosesan Deklarasi Enumerasi
No 1
Rule
Penjelasan
Contoh
enum_specifier :
enum Months
enum name opt_enum_list |
{ JAN = 1,
enum LC enumerator_list RC;
Aturan produksi enum_specifier melakukan reduksi mulai dari kata kunci enum, lalu diikuti nama enumerasi dan badan enumerasi.
FEB, MAR, APR }; enum Empty;
2
opt_enum_list : LC enumerator_list RC | /*empty*/ ;
3
enumerator_list : enumerator | enumerator_list COMMA enumerator ;
4 5
enum : ENUM ;
opt_enum_list merupakan aturan produksi yang { JAN = 1 } menguraikan badan enumerasi. Badan enumerasi direduksi dengan aturan JAN = 1 , FEB enumerator_listsebagai rangkaian list enumerator yang dipisahkan dengan koma. Aturan produksi enum melakukan reduksi dari simbol terminal untuk simbol terminal ENUM
enumerator direduksi dari aturan produksi name JAN = 1 enumerator : name | name EQUAL dan boleh diikuti oleh initializer yang berupa const_expr; const_expr (ekspresi konstan ).
38
Tabel III-4 Pemrosesan Definisi Fungsi
No 1
Rule ext_def : opt_specifiers funct_decl compound_stmt;
Penjelasan
Contoh
ext_def mereduksi fungsi menjadi dua bagian: void bar( int a, int b ) def_list bagian pertama yaitu funct_decl dan def_list yang { menangani deklarasi nama fungsi dan argumennya. Bagian kedua adalah compound_stmt yang char c; menangani badan fungsi. }
2
compound_stmt : LC local_defs stmt_list Badan fungsi ditangani oleh aturan produksi { RC ; compound_stmt, yang mereduksi badan fungsi char c; dari LC '{' kurung kurawal buka dan RC '}' kurung kurawal tutup, serta apa-apa yang ada } diantara keduanya direduksi oleh local_defs ( untuk deklarasi variabel lokal ) dan stmt_list (rangkaian statement yang akan dijelaskan pada upa bab berikutnya).
3
local_defs : def_list ;
Aturan produksi local_defs menangani reduksi char c; untuk deklarasi variabel lokal, aturan produksi ini diambil dari def_list yang telah diuraikan pada Tabel III-2 Pemrosesan deklarasi struktur baris ke tujuh.
39
Tabel III-5 Pemrosesan Ekspresi
No
Rule
Penjelasan
Contoh
1
expr : expr COMMA non_comma_expr | Ekspresi dinyatakan sebagai list dengan rekursif non_comma_expr; kiri, yang tiap itemnya direduksi dari rule non_comma_expr dan dipisahkan dengan koma.
2
non_comma_expr : non_comma_expr QUEST | non_comma_expr COLON | non_comma_expr | non_comma_expr ASSIGNOP | non_comma_expr EQUAL | non_comma_expr | or_expr;
Seperti telah dijelaskan diawal upabab, bahwa a = b ? c : d ; non_comma_expr menerima semua jenis ekspresi, kecuali yang menggunakan koma. Dapat dilihat bahwa operator yang diijinkan pada non_comma_expr adalah QUEST'?' COLON':' ASSIGNOP'*=', '/=', '+=', dst dan EQUAL'='
3
or_expr : or_list ;
or_expr secara singkat adalah aturan produksi yang menangani operator uner dan biner, serta list dari operator uner dan biner, dengan menurunkannya ke rule lain yaitu, rule or_list.
40
41
Pemrosesan Statement
Statetement dapat diterjemahkan menjadi salah satu dari berikut : a. satu buah titik koma, dalam C ini disebut statetement kosong b. compound_stmt, sebagaimana telah disinggung saat menguraikan proses penanganan definisi fungsi, compound_stmt adalah representasi dari badan fungsi, atau lebih umum adalah suatu blok kode. c. Suatu ekspresi yang diikuti titik koma diakhirnya. d. Semua control flow seperti if/else dan pengulangan (while, for,dll) e. return diikuti ekspresi, lalu titik koma f. goto
Karena terlalu membutuhkan banyak ruang, aturan produksi untuk pemrosesan statement dapat dilihat langsung pada lampiran A.
3.4
Konfigurasi Kakas Flex dan Yacc Ada dua kakas penting dalam proses pembangunan perangkat lunak C2P, yaitu lex/flex
dan yacc/bison. Kakas pertama adalah lexical analyzer generator dan kakas kedua adalah parser generator. Pertimbangan menggunakan kakas adalah pengembangan dengan kakas jauh lebih hemat tenaga dan waktu ( mengingat keterbatasan sumber daya dalam pelaksanaan tugas akhir ini ). Pengembangan dengan kakas juga jauh lebih mudah dan bebas dari kesalahan ( dalam arti kesalahan lebih mudah diatasi dan diperbaiki ). Lex / flex menerima masukan berupa berkas yang berisi spesifikasi token dari bahasa yang akan diproses oleh translator. Spesifikasi token pada lex dinyatakan sebagai ekspresi reguler ( regex ). Misal : token yang menyatakan satu angka dari 0 s/d 9 (bilangan desimal) dalam ekspresi reguler adalah [0-9]. Untuk satu huruf alphabet dinyatakan sebagai [a-zA-Z]. Pengulangan dinyatakan dengan tanda ‘*’ dan ‘+’ , misal : string adalah rangkaian huruf alphabet ( pengulangan satu atau lebih huruf ) maka representasi ekspresi reguler-nya adalah [azA-Z]+ . Contoh ekspresi reguler yang dipakai pada tugas akhir ini dapat dilihat pada Tabel III-6
42
Tabel III-6 Konfigurasi input untuk Kakas Lex/Flex
token dalam C bilangan digit desimal ( 0, 1, 13, 12309, dll ) rangkaian karakter ( main, _a, int, dll ) , C mengijinkan underscore kombinasi string dan angka ( alphanumeric ) kata kunci bahasa C ( auto, break, case, char, dst )
operator aritmetik : + ++ -* / % operator logika : && || !
ekspresi reguler Lex/Flex [0-9]+ [_a-zA-Z]+ [_a-zA-Z0-9]+ “auto” “break” “case” “char” ... ... “void” “while” “+” “++” “-” “--” “*” “/” “%” “&&” “||” “!”
Kakas berikutnya adalah Yacc/Bison , kakas ini menerima masukan berupa berkas yang berisi deskripsi grammar dari bahasa yang akan di-parsing. Berkas ini dapat dibagi menjadi empat besar bagian : a. Definisi simbol terminal b. Definisi operator dan urutan precedence-nya c. Penanganan masalah shift / reduce ( hal ini karena parser yang dihasilkan yacc/bison adalah LALR parser ) d. Definisi grammar
Contoh berkas masukan untuk Yacc/Bison dapat dilihat pada Tabel III-7
43
Tabel III-7 Konfigurasi input untuk Kakas Yacc/Bison
komponen parsing simbol terminal : kata kunci bahasa C
tipe dasar ( int, char, long, float, dll ) string ( misal : “helloworld“ ) integer / long constant ( misal : 0, 1, 232899 ) floating point ( misal : 0.2323, .09023, 1.232)
representasi dalam yacc/bison %term WHILE DO FOR %tem ENUM %term IF ELSE %term RETURN GOTO %term BREAK CONTINUE %term SWITCH CASE DEFAULT %term %term %term %term
TYPE STRING ICON FCON
karakter khusus : kurung buka tutup, titik koma, %term LC RC titik tiga kali. %token SEMI %token ELLIPSE precedensi operator : %left COMMA operator koma %right
EQUAL '=' ASSIGNOP operator sama dengan %right QUEST COLON operator tanda tanya %left OROR operator ‘| |’ %left ANDAND operator ‘&&’ %left OR operator ‘ | ‘ %left XOR operator ‘ ^ ‘ %left AND operator ‘ & ’ %left EQUOP operator ‘==’ %left RELOP operator relasional ( < , <=, >, >= ) %left SHIFTOP operator shift ( << , >> ) %left PLUS MINUS operator ‘ + ’ dan ‘ – ‘ %left STAR '*' DIVOP operator ‘ * ’ , ‘ / ’ , sizeof , ! , ~ , ++ , -%right SIZEOF "sizeof" UNOP INCOP operator ‘[‘ , ‘]’ , ‘(’ , ‘)’ dan ‘ -> ’
%left LB '[' RB ']' LP '(' RP ')' STRUCTOP
sisanya adalah spesifikasi grammar bahasa C, telah dijelaskan pada upabab sebelumnya tentang pembahasan spesifikasi grammar.
44
3.5
Proses Konversi
Konversi Simbol Simbol yang dimakud disini adalah semua identifier, baik itu variabel atau subrutin. Adapun preprocessor ( seperti include dan define tidak termasuk dalam batasan simbol ). a. Obyek pada C yang menggunakan karakter '_' sebagai karakter pertama dalam namanya, digantikan dengan menggunakan karakter 'U' ( hal ini karena Pascal tidak membolehkan penggunaan '_' sebagai karakter pertama dalam nama simbol.) b. Jika obyek mengalami redeklarasi ( deklarasi ulang ) yang tidak memungkinkan diterima di Pascal, sistem akan menyisipkan angka pada bagian nama yang paling tidak signifikan. Mis : a_long_identifier dan A_LONG_IDENTIFIER ( Pascal tidak case sensitive ) dikonversi menjadi
a_long_identifier dan a_long_identifier2
c. Nama obyek yg mengalami bentrok dengan keyword / reserved word di Pascal harus dibuat unik. misal : begin diubah menjadi begin_ d. Obyek yang dideklarasikan global, akan dikonversi juga ke dalam Pascal sebagai obyek global. e. Obyek yang berfungsi sebagai parameter formal suatu subrutin, dikonversi sehingga hanya memiliki cakupan dalam satu subrutin saja. f.
Obyek berupa label yang menggunakan forward-reference dikonversi sehingga terlebih dulu dideklarasikan. Hal yang sama juga pada struct, enum, atau union, hanya saja tiga yang terakhir ini dikonversi menjadi tipe record. Tabel III-8 memperlihatkan contoh kasus konversi tipe struktur / record. Tabel III-8 Konversi typedef
typedef struct list { int item; list *next; } list ;
TYPE P_list list item next END;
= = : :
^list; RECORD integer; P_list;
45
Tabel III-9 Pemakaian Nama Tipe sebagai identifier
Menghasilkan Error pada Pascal type s = record i : integer; c : char; end;
ekspresi yang valid di C struct s { int char }; int s;
i; c;
var s: integer;
Tabel III-9 menunjukkan bahwa penggunaan user-defined tipe sebagai nama suatu identifier variabel pada Pascal akan menghasilkan error. g. Nama label dikonversi menjadi integer pada Pascal, karena Pascal menggunakan label dalam representasi integer h. Storage dari suatu obyek C diindikasikan dengan lima jenis keyword yaitu : auto, extern, register, static, dan typedef. Konversi dari masing-masing storage ke Pascal ditampilkan pada tabel III-9 Tabel III-10 Konversi storage class
auto extern
register static typedef
obyek menjadi variabel lokal pada suatu prosedur obyek menjadi variabel global yang diimpor dari unit kompilasi yang lain. ( fitur ini tidak ada pada Pascal standar, sehingga tidak diimplementasikan ) obyek menjadi variabel global obyek didefinisikan dengan deklarasi TYPE
Variabel lokal yang dideklarasikan sebagai static akan diekspor menjadi variabel global, dan inisialisasinya dilakukan di awal eksekusi program. sedangkan variabel lokal yang dideklarasikan sebagai register, deklarasinya akan dialokasikan pada awal deklarasi lokal. Dengan demikian, tipe obyek pada Pascal hanya ada dua macam yaitu
46
global atau lokal. i. Obyek dengan nama yang sama namun dideklarasikan dalam inner-scope yang berbeda dalam satu blok rutin, diperbolehkan di C, namun tidak diijinkan di Pascal. misal : nama variabel ‘i’ pada kode dibawah ini harus diubah karena, Pascal akan mengenali obyek 'i' yang terakhir sebagai duplikasi deklarasi. Tabel III-11 Penanganan duplikasi visibilitas variabel
{ int i;
...i... { int i; ...i... }
Var i : integer; i1 : integer; Begin ...i... ...i1...
...i....
...i.... End.
}
Konversi Tipe
Pada upabab yang menjelaskan tentang specifier, telah dijelaskan bahwa konversi tipe dasar dari C ke Pascal dilakukan secara trivial. Pada upabab ini, pembahasan dilakukan terhadap konversi tipe untuk kasus-kasus khusus, misal konversi nilai pointer, struct dan union, dll. a. Tipe integer C memiliki tiga tipe integer, yaitu short, int, dan long. Sedangkan Pascal hanya memiliki satu tipe, yaitu integer. Ketiga tipe integer pada C diubah menjadi satu integer pada Pascal. b. Tipe Karakter Pada C, obyek dari tipe karakter mungkin mengalami konversi ke integer . C2P memaksa konversi ini dilakukan melalui pustaka standar untuk konversi di Pascal. c. Tipe Floating-Point Pada C, ada dua jenis floating point yaitu float dan double . Semua floating point dikonversi
47
ke Pascal menjadi obyek dengan tipe real. d. Pointer Nilai NULL pada pointer diubah menjadi nol saat evaluasi ekspresi. Nilai ini diubah ke Pascal menjadi NIL. e. Tipe unsigned unsigned tidak menerima nilai negatif, sehingga ketika diubah ke Pascal, variabel dari tipe ini dikonversi menjadi nilai dalam range yang positif, misal : 0 . . maxint f. Tipe Enumerasi Konversi tipe enumerasi diubah menjadi konstanta integer pada Pascal. g. Tipe Struktur Contoh konversi struktur dapat dilihat pada Tabel III-12 Tabel III-12 Pemrosesan struktur
C struct name {...} ; struct {...} name ; struct sname {...} vname ;
Pascal TYPE name = RECORD ... END; VAR name = RECORD ... END; TYPE sname = RECORD ... END; VAR vname : sname ;
Sedangkan operasi pada struktur, dibagi menjadi dua, yaitu operasi oleh variabel biasa dan operasi oleh pointer. Operasi pada variabel biasa menggunakan operator '.' (titik) hal ini dilakukan pada C dan juga Pascal. Operasi struktur pada pointer di C menggunakan operator '->' sedang pada Pascal menggunakan operator '^.' Union secara gramatikal identik dengan struktur, pada C perbedaan antara keduanya hanya terletak pada inisialisasi address dan alignment item-itemnya. Inisialisasi ini dilakukan ketika kode C diterjemahkan ke level yang lebih rendah, misal C-Code atau assembly. Contoh pemrosesan union dapat dilihat pada Tabel III-13.
48 Tabel III-13 Pemrosesan union
C union{ int i ; char c [ 2 ] ; };
Pascal RECORD CASE INTEGER OF 0 : ( i : INTEGER ); 1 : (c : ARRAY[ 0..1 ] OF CHAR; END ;
h. Tipe yang didefinisikan dengan typedef typedef digunakan di C untuk mendefinisikan tipe baru, pada Pascal ini identik dengan reserved word TYPE. Tabel III-14 memperlihatkan contoh pemrosesan typedef Tabel III-14 Pemorsesan typedef
typedef
C int *PI;
TYPE
Pascal PI = ^integer;
Konversi Antar Tipe
Konversi antar tipe membutuhkan pemrosesan tambahan, karena pada C, konversi antar tipe yang berbeda seringkali menggunakan konversi implisit. Sedangkan pada Pascal, konversi antar tipe harus menggunakan fungsi / subrutin. Hal ini menjadikan kompilator bahasa harus melakukan pengecekan tipe hasil evaluasi ekspresi. Pada tugas akhir ini, aplikasi yang dikembangkan tidak menangani masalah konversi tipe secara implisit. Penanganan Ekspresi
a. Ekspresi Primer Nama variabel dievaluasi sebagai suatu obyek di tabel simbol yang memiliki tipe tertentu, dan memiliki nilai (value). Nama dari suatu senarai ( array ), diacu sebagai pointer ke elemen pertama dalam array, dalam C. Pada Pascal, senarai selalu diacu sebagai obyek lvalue. Karena itu, nama array pada C akan dikonversi sebagai elemen pertama dari array. b. Pemanggilan fungsi Pemanggilan fungsi bisa dilakukan dengan parameter tambahan, yaitu dengan menggunakan fitur ellipsis. Pada Pascal, pemanggilan fungsi harus sesuai dengan definisi, dan jumlah parameter harus sesuai dengan definisi fungsi, demikian juga tipe parameter tidak boleh
49
diubah. c. Pointer To Function Pascal tidak memungkinkan Pointer to Function d. Ekpresi kondisional Ekspresi kondisional diterjemahkan dengan menggunakan fungsi pada Tabel III-15 Tabel III-15 Ekspresi Kondisional
C z = a ? b++ : c++
Pascal z := IfThenElse(a, Inc(b), Inc(c) );
Penanganan Subrutin
Pembahasan tentang penanganan subrutin, dibatasi hanya pada masalah passing parameter dan nilai kembalian. Pascal memungkinkan passing by address dengan keyword VAR pada definisi fungsi. Untuk menentukan apakah suatu parameter fungsi pada kode C harus diterjemahkan menjadi VAR pada Pascal, hal ini memerlukan analisis konteks pada kode sumber. Karena hal ini kompleks, fitur ini tidak diimplementasikan. Nilai kembalian subrutin menentukan proses penerjemahan. Subrutin dengan nilai kembalian berupa void, akan ditranslasi sebagai procedure, subrutin dengan nilai kembalian selain void ditranslasi sebagai function.