ANALISIS PEMECAHAN MASALAH

dokumen-dokumen yang mirip
ANALISIS DAN PERANCANGAN PERANGKAT LUNAK

PENGEMBANGAN PROTOTIPE APLIKASI KONVERSI KODE DARI BAHASA C KE PASCAL

Aplikasi Translator Kode Dari Bahasa C ke Pascal

BAB II DASAR TEORI. 2.1 Kompilator

Sejarah C. Dirancang oleh Denis M. Ritchie tahun 1972 di Bell Labs.

Bahasa C-M6 By Jamilah, Skom 1

Chapter 1 KONSEP DASAR C

Tipe Data dan Operator

BAHASA PEMROGRAMAN C

Achmad Solichin.

Syntax, Semantic & Grammar. Konsep Bahasa Pemrograman Materi 3 Yudianto Sujana, M.Kom

Algoritma & Pemrograman

Implementasi Dan Pengujian

Pertemuan 4 ELEMEN-ELEMEN BAHASA PEMROGRAMAN

MODUL PRAKTIKUM ALGORITMA DAN STRUKTUR DATA PERTEMUAN 1

VARIABEL, TIPE DATA DAN EKSPRESI Bab 2

PRAKTIKUM 2. perubah (variabel), konstanta, fungsi, atau obyek lain yang didefinisikan oleh

P 4 Bab 3 : Dasar Pemrograman C

Alat bantu (tools) dalam pembuatan parser/ analisis sintaksis. Menggunakan simbol persegi panjang untuk non terminal

3. Elemen Dasar C++ S. Indriani S. L., M.T L.,

BAB II SINTAKS 2.1. SINTAKS

Aplikasi Rekursif dalam Analisis Sintaks Program

ELEMEN DASAR C++ C++ mempunyai cara untuk menyatakan karakter-karakter yang tidak mempunyai kode tombol (seperti karakter tombol) misalnya \n.

TIPE DATA, VARIABLE, dan OPERATOR DELPHI

Ringkasan 32 keyword dalam C

Tipe Data, Variabel, Input/Output

ANALISIS SEMANTIK. Teknik Kompilasi Dosen: Utami Dewi W.,S.Kom

Dasar Pemrograman Mikrokontroler dengan Bahasa C

Modul 1 Dasar Dasar Bahasa Pemrograman C

KONSEP DASAR BAHASA C

PERTEMUAN 2 ALGORITMA & PEMROGRAMAN

I. Tipe Data - Variabel

Hirarki Comsky. Unrestricted. Context Sensitive Context free Regular

DATA PADA BAHASA C TIPE DATA

Cara pertama adalah pada saat deklarasi variabel ditambahkan ke- yword const sebelum nama tipe data seperti

VARIABEL, TIPE DATA, KONSTANTA, OPERATOR DAN EKSPRESI. Pemrograman Dasar Kelas X Semester 2

TEKNIK KOMPILASI Tony Darmanto,ST / Smt V S1 TI / STMIK WIDYA DHARMA/ Hal 16

Dasar Pemrograman Java

BAB I PENDAHULUAN. 1.1 Latar Belakang

Struktur Program Bahasa C

PENGANTAR KOMPUTER & SOFTWARE I REPRESENTASI DATA

OPERASI PERNYATAAN KONDISI

SMA SANTO PAULUS PONTIANAK

DASAR PEMOGRAMAN JAVA

BAHASA PEMROGRAMAN JAVA PUTU INDAH CIPTAYANI JURUSAN SISTEM INFORMASI STMIK AMIKOM YOGYAKARTA

PENGANTAR KOMPUTER & SOFTWARE I REPRESENTASI DATA

Tipe bentukan dan pointer selanjutnya akan kita pelajari pada modul pemrograman 1 (akhir semester).

Tabel Informasi. Hal di atas dapat dilakukan dengan menambah dan mengambil atribut identifier yang digunakan pada program, melalui tabel informasi.

Bab 2. Dasar-Dasar Pemrograman C

Turbo C adalah tool yang dipakai untuk membuat code program dalam bahasa C ataupun C++. Berikut adalah jendela utama Turbo C

Desain dan Analisis Algoritma. Pengenalan Bahasa C. I Ketut Resika Arthana, S.T., M.Kom.

elemen Dasar Bahasa Pemrograman C

Elemen Bahasa Pemrograman. Aditya Rizki Yudiantika, M.Eng.

PSEUDOCODE TIPE DATA, VARIABEL, DAN OPERATOR

Objek Data, Variabel, dan Konstanta. Konsep Bahasa Pemrograman Materi 4 Yudianto Sujana, M.Kom

PERTEMUAN V PEMROGRAMAN TERSTRUKTUR DENGAN VISUAL C Setiap bahasa C mempunyai satu fungsi dengan nama main (program utama).

MATERI 2 JENIS-JENIS DATA SEDERHANA & INPUT/OUTPUT DATA

Percabangan & Perulangan

MK. PEMROGRAMAN SISTEM Semester/SKS : 6/3 COMPILER. Jurusan Sistem Komputer S1 Universitas Gunadarma

Badiyanto, S.Kom., M.Kom. PBO java

ALGORITMA DAN STRUKTUR DATA POINTER DAN FUNCTION

SINTAKS. Sintaks dari bahasa pemrograman di defenisikan dengan 2 kumpulan aturan, yaitu:

Keg. Pembelajaran 2 : Mengenal Bahasa C++

OPERATOR BAHASA C. Obyektif : 4. Mengetahui macam-macam operator dalam Bahasa C. 5. Mengetahui dan dapat menggunakan format pada tiap tipe data..

BAB II VARIABEL DAN TIPE DATA

Bahasa C, pada awalnya dirancang sebagai bahasa pemrograman yang dioperasikan pada sistem operasi UNIX.

PEMROGRAMAN JAVA. Petunjuk Penulisan Program Token Aturan Penamaan Identifier Lingkungan /Scope dari variabel Tipe Data (i) Yoannita

PERTEMUAN 2 ARRAY, PERCABANGAN, DAN PERULANGAN

UNIVERSITAS SAM RATULANGI MANADO FAKULTAS TEKNIK, JURUSAN TEKNIK ELEKTRO Program Studi S-1 Teknik Informatika. Data & Ekspresi

2 TIPE DATA DAN VARIABEL

JAVA BASIC PROGRAMMING Joobshet

MODUL DUA VARIABEL DAN TIPE VARIABEL

Pengantar dalam Bahasa Pemrograman Turbo Pascal Tonny Hidayat, S.Kom

SUMBER BELAJAR PENUNJANG PLPG

VARIABEL & TIPE DATA PEMROGRAMAN C++

Identifier, Keywords, Variabel, Tipe Data Primitif dan Operator PBO. Ramos Somya

Dasar Pemrograman Komputer [TKL-4002] 2010

LAB PEMROGRAMAN I (JAVA FUNDAMENTAL) PERTEMUAN 3 Dosen : Bella Hardiyana S. Kom

Tipe data dasar merupakan tipe data yang disediakan oleh kompailer, sehingga dapat langsung dipakai Dalam algoritma dan pemrograman yang termasuk dala

E STRUKTUR DATA & E PRAKTIK STRUKTUR DATA. Pointer & Function. Alfa Faridh Suni, S.T., M.T. PTIK

PHP (HYPERTEXT PREPROCESSOR)

Fungsi : Dasar Fungsi

Tipe Data, Identifier, Operator dan Control Statement

Struktur Data adalah : suatu koleksi atau kelompok data yang dapat dikarakteristikan oleh organisasi serta operasi yang didefinisikan terhadapnya.

Elemen Dasar Dalam Bahasa Java

A. TUJUAN 1. Menjelaskan tentang prinsip dasar fungsi. 2. Menjelaskan tentang.parameter formal dan parameter aktual

Pemrograman Dasar C. Minggu 4

Kisi-Kisi Ujian Tengah Semester Algoritma dan Pemrograman Lanjut

Pendahuluan Pemrograman Mikrokontroler

PEMROGRAMAN BERORIENTASI OBJEK. Tipe Data. Budhi Irawan, S.Si, M.T

Teori Algoritma TIPE DATA

INSTRUKSI. TTH2D3 Mikroprosesor

Keyword,Tipe data & Variabel. Keywords pada c Tipedata Variabel Konstanta

Pengenalan C++ Oleh : Dewi Sartika

TIPE, NAMA, DAN NILAI

BAB VII DASAR-DASAR PHP

Reserved words Reserved words atau keywords merupakan kata-kata spesifik digunakan oleh compiler untuk keperluan pemrograman. Contoh reserved words

Struktur Dasar Bahasa C Tipe Data Dalam bahasa C terdapat lima tipe data dasar, yaitu :

IT210 Pemrograman Visual. Ramos Somya

Bahasa Pemrograman SAHID CHESTERLIZER.

Transkripsi:

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. Halhal 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 token C Spesifikasi grammar C pembangkitan scanner pembangkitan parser Scanner bahasa C Parser bahasa C pembangkitan AST Pembangkitan tabel simbol dan sistem representasi tipe Pembangkitan kode bahasa Pascal Gambar III1 Alur Kerja Global 31

32 Gambar III1 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 rutinrutin 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. Halhal 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 bottomup ini akan dijelaskan dengan cara topdown. 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 III1. Pembahasan pada upabab ini hanya dilakukan untuk halhal yang penting dan mendasar saja, mengingat banyaknya aturan.

Tabel III1 Spesifikasi Grammar No Rule Penjelasan Contoh 1 program : ext_def_list; Program dalam bahasa C diterjemahkan sebagai list dari external definition of symbol (dalam hal ini adalah ext_def_list ). Jadi, program dalam C adalah serangkaian definisi simbol/obyek 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 SEMI opt_specifier SEMI opt_specifier funct_decl def_list compound_stmt ; 4 ext_decl_list : ext_decl ext_decl_list COMMA ext_decl ; 5 ext_decl : var_decl var_decl EQUAL initializer funct_decl ; ext_def adalah serangkaian deklarasi simbol dengan tipe specifier tertentu. Ext_def merupakan aturan produksi untuk kasus deklarasi suatu variabel atau subrutin. Deklarasi variabel dan subrutin ditangani oleh aturan pertama, yaitu dengan ext_decl_list. Sedangkan aturan ketiga menangani definisi fungsi (definisi, bukan deklarasi) ext_decl_list adalah suatu list rekursif kiri dari ext_decl ext_decl berfungsi melakukan enkapsulasi dari dua tipe deklarasi, yaitu deklarasi variabel biasa dan deklarasi subrutin. Aturan kedua dari produksi diatas berfungsi menangani deklarasi variabel dengan inisialisasinya. int c; int foo(); void bar() { } int c; void bar() { } Foo, bar i = 5 a[3] = { 1, 2, 3 } foo( int b ) 33

Lanjutan tabel III1 No Rule Penjelasan Contoh 6 opt_specifier : CLASS TTYPE TTYPE specifiers ; 7 specifiers : type_or_class specifiers type_or_class; opt_specifier berfungsi melakukan enkapsulasi antara tipe bentukan (TTYPE) dengan specifiers yang merupakan tipe default dari C. CLASS adalah simbol terminal yang menyatakan storage class ( auto, extern, static, typedef,atau register). Specifiers merupakan list rekursif kiri dari type_or_class. List ini memungkinkan deklarasi 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 ; type_or_class berfungsi melakukan enkapsulasi antara storage class dengan type_specifier. 9 type_specifier : TYPE enum_specifier struct_specifier; 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_specifier berfungsi melakukan enkapsulasi dari tiga tipe dasar, yaitu TYPE (simbol terminal untuk tipe default, TYPE melakukan reduksi dari token int, char, float, double, dll ), enum_specifier ( dibahas lebih lanjut pada upabab proses parsing ) dan struct_specifier ( juga dibahas pada upabab proses parsing ). Aturan produksi var_decl menangani deklarasi variabel dengan melakukan reduksi dari nama variabel dan kombinasinya dengan penambahan ( LP Left Parenthesis, ) RP Right Parenthesis, [ LB Left Bracket, ] RB Right Bracket, dan * STAR. const_expr digunakan untuk menangani deklarasi senarai, karena itu const_expr adalah ekspresi untuk nilai konstan. static int point extern point static int extern double int static int struct point enum E1 Arr Foo() Bar( int i, int j ) 34

Lanjutan tabel III1 No Rule Penjelasan Contoh 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 name_list new_name ; 13 var_list : param_declaration var_list COMMA param_declaration: Aturan produksi funct_decl digunakan untuk menangani deklarasi fungsi. Deklarasi fungsi 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. 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 ). Pembahasan deklarasi variabel dicukupkan hanya 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 Foo() Bar( int i, int j ) 35

36 3.3 Proses Parsing Proses parsing merupakan proses inti dalam aplikasi ini, karena pada saat grammar diparsing, 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 III2 Pemrosesan deklarasi strukturtabel III1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi, untuk pemrosesan deklarasi enumerasi dapat dilihat pada Tabel III3 sedangkan untuk pemrosesan definisi fungsi dapat dilihat pada Tabel III4. 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 CCode, 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 III5 memperlihatkan pemrosesan ekspresi pada bahasa C.

Tabel III2 Pemrosesan Deklarasi Struktur No Rule Penjelasan Contoh 1 struct_specifier : STRUCT opt_tag LC def_list RC STRUCT tag; 2 opt_tag : tag /*empty*/ ; 3 tag : NAME ; 4 def_list : def_list def /*empty*/; 5 def : specifiers decl_list SEMI specifiers SEMI ; 6 decl_list : decl decl_list COMMA decl ; 7 decl : funct_decl var_decl var_decl EQUAL initializer var_decl COLON const_expr COLON const_expr; Aturan produksi diatas mereduksi deklarasi struct. STRUCT merupakan simbol terminal untuk kata kunci struct, opt_tag menangani deklarasi struct dengan nama tag, def_list mereduksi list yang berisi itemitem informasi pada badan struktur. Opt_tag bersifat optional Karena opt_tag bersifat optional, maka aturan kedua merepresentasikan hal tersebut, yaitu penggunaan aturan kosong. tag melakukan reduksi langsung dari simbol terminal NAME. def_list mirip dengan ext_def_list yang telah diuraikan pada Tabel III1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi baris ke tiga Def juga serupa dengan ext_def yang telah diuraikan pada Tabel III1 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 pada Tabel III1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi baris ke tujuh decl juga serupa dengan ext_decl yang telah diuraikan pada Tabel III1 Spesifikasi grammar untuk proses parsing deklarasi variabel dan fungsi baris ke 11 struct point { int x, y; } p; struct { int x, y; } p1; d, e, foo, bar 37

Tabel III3 Pemrosesan Deklarasi Enumerasi No Rule Penjelasan Contoh 1 enum_specifier : enum name opt_enum_list enum LC enumerator_list RC; 2 opt_enum_list : LC enumerator_list RC /*empty*/ ; 3 enumerator_list : enumerator enumerator_list COMMA enumerator ; 4 5 enum : ENUM ; enumerator : name name EQUAL const_expr; Aturan produksi enum_specifier melakukan reduksi mulai dari kata kunci enum, lalu diikuti nama enumerasi dan badan enumerasi. opt_enum_list merupakan aturan produksi yang menguraikan badan enumerasi. Badan enumerasi direduksi dengan aturan 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 dan boleh diikuti oleh initializer yang berupa const_expr (ekspresi konstan ). enum Months { JAN = 1, FEB, MAR, APR }; enum Empty; { JAN = 1 } JAN = 1, FEB JAN = 1 38

Tabel III4 Pemrosesan Definisi Fungsi No Rule Penjelasan Contoh 1 ext_def : opt_specifiers funct_decl def_list compound_stmt; 2 compound_stmt : LC local_defs stmt_list RC ; ext_def mereduksi fungsi menjadi dua bagian: bagian pertama yaitu funct_decl dan def_list yang menangani deklarasi nama fungsi dan argumennya. Bagian kedua adalah compound_stmt yang menangani badan fungsi. Badan fungsi ditangani oleh aturan produksi compound_stmt, yang mereduksi badan fungsi dari LC '{' kurung kurawal buka dan RC '}' kurung kurawal tutup, serta apaapa 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 untuk deklarasi variabel lokal, aturan produksi ini diambil dari def_list yang telah diuraikan pada Tabel III2 Pemrosesan deklarasi struktur baris ke tujuh. void bar( int a, int b ) { char c; } { char c; } char c; 39

Tabel III5 Pemrosesan Ekspresi No Rule Penjelasan Contoh 1 expr : expr COMMA non_comma_expr non_comma_expr; 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; Ekspresi dinyatakan sebagai list dengan rekursif kiri, yang tiap itemnya direduksi dari rule non_comma_expr dan dipisahkan dengan koma. Seperti telah dijelaskan diawal upabab, bahwa 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. a = b? c : d ; 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 [09]. Untuk satu huruf alphabet dinyatakan sebagai [azaz]. Pengulangan dinyatakan dengan tanda * dan +, misal : string adalah rangkaian huruf alphabet ( pengulangan satu atau lebih huruf ) maka representasi ekspresi regulernya adalah [azaz]+. Contoh ekspresi reguler yang dipakai pada tugas akhir ini dapat dilihat pada Tabel III6

42 Tabel III6 Konfigurasi input untuk Kakas Lex/Flex token dalam C ekspresi reguler Lex/Flex bilangan digit desimal ( 0, 1, 13, 12309, dll ) [09]+ rangkaian karakter ( main, _a, int, dll ), C mengijinkan [_azaz]+ underscore kombinasi string dan angka ( alphanumeric ) [_azaz09]+ kata kunci bahasa C ( auto, break, case, char, dst ) auto break case char...... void while operator aritmetik : + ++ * / % operator logika : &&! + ++ * / % &&! Kakas berikutnya adalah Yacc/Bison, kakas ini menerima masukan berupa berkas yang berisi deskripsi grammar dari bahasa yang akan diparsing. Berkas ini dapat dibagi menjadi empat besar bagian : a. Definisi simbol terminal b. Definisi operator dan urutan precedencenya 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 III7

43 Tabel III7 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) karakter khusus : kurung buka tutup, titik koma, titik tiga kali. precedensi operator : operator koma operator sama dengan operator tanda tanya operator operator && operator operator ^ operator & operator == operator relasional ( <, <=, >, >= ) operator shift ( <<, >> ) operator + dan operator *, /, sizeof,!, ~, ++, operator [, ], (, ) dan > representasi dalam yacc/bison %term WHILE DO FOR %tem ENUM %term IF ELSE %term RETURN GOTO %term BREAK CONTINUE %term SWITCH CASE DEFAULT %term TYPE %term STRING %term ICON %term FCON %term LC RC %token SEMI %token ELLIPSE %left COMMA %right <ascii> EQUAL '=' ASSIGNOP %right QUEST COLON %left OROR %left ANDAND %left OR %left XOR %left AND %left <ascii> EQUOP %left <ascii> RELOP %left <ascii> SHIFTOP %left PLUS MINUS %left <ascii> STAR '*' DIVOP %right <ascii> SIZEOF "sizeof" UNOP INCOP %left <ascii> 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 forwardreference 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 III8 memperlihatkan contoh kasus konversi tipe struktur / record. Tabel III8 Konversi typedef typedef struct list { int item; list *next; } list ; TYPE P_list = ^list; list = RECORD item : integer; next : P_list; END;

45 Tabel III9 Pemakaian Nama Tipe sebagai identifier ekspresi yang valid di C struct s { int i; char c; }; int s; Menghasilkan Error pada Pascal type s = record i : integer; c : char; end; var s: integer; Tabel III9 menunjukkan bahwa penggunaan userdefined 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 masingmasing storage ke Pascal ditampilkan pada tabel III9 Tabel III10 Konversi storage class auto obyek menjadi variabel lokal pada suatu prosedur extern obyek menjadi variabel global yang diimpor dari unit kompilasi yang lain. ( fitur ini tidak ada pada Pascal standar, sehingga tidak diimplementasikan ) register static obyek menjadi variabel global typedef 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 innerscope 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 III11 Penanganan duplikasi visibilitas variabel { int i;...i... { int i;...i... } Var i : integer; i1 : integer; Begin...i......i1... }...i... End....i... 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 kasuskasus 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 FloatingPoint 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 III12 Tabel III12 Pemrosesan struktur struct name {...} ; struct {...} name ; struct sname {...} vname ; C 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 itemitemnya. Inisialisasi ini dilakukan ketika kode C diterjemahkan ke level yang lebih rendah, misal CCode atau assembly. Contoh pemrosesan union dapat dilihat pada Tabel III13.

48 Tabel III13 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 III14 memperlihatkan contoh pemrosesan typedef Tabel III14 Pemorsesan typedef C Pascal typedef int *PI; TYPE 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 III15 Tabel III15 Ekspresi Kondisional C Pascal z = a? b++ : c++ 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.