Abstract – Makalah ini akan membahas mengenai dimana kondisi itu memanggil dirinya sendiri untuk
bagaimana menerapkan sifat rekursif untuk mengecek melanjutkan ke kondisi tahap berikutnya. Definisi ini juga
kebenaran sintaks program, dimana pengecekan ini berlaku untuk fungsi dan prosedur di bidang pemrograman.
merupakan salah satu tahap yang dilakukan oleh Dalam teori rekursif, ada 2 bagian penting yang
compiler. Sintaks program yang memiliki beberapa mendasari cara kerja teori ini, yaitu:
identifier dan karakter umum akan dijadikan sebagai 1. Bagian basis → bagian ini berperan untuk membuat
token dan dimasukkan ke sebuah list. Pengecekan sintaks proses rekursif berhenti agar tidak terjadi proses rekursif
secara umum dapat dilakukan dengan metode Context terus menerus.
Free Grammar (CFG). Metode CFG yang 2. Bagian rekursif → bagian ini berperan untuk
diimplementasikan secara rekursif tidak memerlukan memanggil fungsi/prosedur itu sendiri dengan
proses parsing. Hal lainnya adalah bahasa pemrograman
parameter/kondisi yang mendekati basis sehingga proses
yang digunakan di makalah ini adalah bahasa
rekursif diusahakan untuk berhenti.
pemrograman dasar yang memiliki kemiripan dengan
Pascal. Berikut salah satu contoh proses rekursif dalam
menghitung nilai faktorial.
Kata kunci – CFG, compiler, list, parsing, rekursif,
sintaks. Long int faktorial (int N) {
long int F;
[1] if (N <= 1) { return 1; }
I. PENDAHULUAN [2] else { F = N * faktorial(N-1);
[3] return F; }
Pernahkah Anda membayangkan bagaimana cara sebuah }
compiler bahasa pemrograman bekerja? Secara umum,
compiler akan melakukan 7 tahap yaitu Lexical Analysis, Dari petikan program di atas, yang menjadi bagian basis
Syntax Analysis, Semantic Analysis, IR Generation, IR adalah baris [1], yaitu jika nilai N sudah kurang atau sama
Optimization, Code Generation, dan Optimization. Namun, dengan 1, maka nilai faktorialnya adalah 1. Kemudian,
pada makalah ini kita hanya akan membahas mengenai yang menjadi bagian rekursifnya adalah baris [2], dimana
Syntax Analysis, dimana yang menjadi fokus dari analisis nilai N masih lebih besar dari 1, sehingga disimpan ke
ini adalah kebenaran tata bahasa dari semua identifier variabel F yang bernilai N itu sendiri dikalikan dengan
maupun operasi perhitungan. nilai faktorial berparameter N-1. Kita dapat melihat bahwa
Untuk memecahkan masalah di atas, salah satu metode parameter fungsi faktorial semakin mengeceil mendekati 1
yang dapat digunakan adalah teori Context Free Grammar (menuju basis). Hasil akhir faktorial bilangan N akan
(salah satu bidang studi di Teori Bahasa dan Otomata), dikembalikan di baris [3] setelah bagian basis
dimana bagian Left Hand Side (LHS) direpresentasikan mengembalikan nilai 1.
sebagai nama fungsi/prosedur atau identifier, dan bagian
Right Hand Side (RHS) direpresentasikan sebagai B. Teori Context Free Grammar (CFG)
kemungkinan hasil yang dapat dicapai dari fungsi/prosedur
atau identfier di LHS. Context Free Grammar (CFG) adalah sebuah proses
Berdasarkan teknik representasi LHS dan RHS yang menghasilkan string secara rekursif dengan memanggil
dijelaskan di atas, maka dapat digunakan metode rekursif produksi aturan yang bersangkutan. CFG ini dapat juga
dimana sebuah fungsi memanggil dirinya sendiri dikatakan sebagai proses interpretasi/prediksi string yang
dikarenakan adanya keterkaitan antara sebuah blok ingin dibentuk dari semua kemungkinan pola dan aturan-
program dengan blok program lainnya. aturan.
Sebuah CFG mengandung beberapa komponen penting
yang dapat dijelaskan sebagai berikut:
II. TEORI DASAR 1. Komponen terminal → kumpulan karakter yang
A. Teori Rekursif terdapat dalam string yang akan dibentuk dari CFG
tersebut.
Suatu kondisi dinamakan rekursif jika ada keadaan 2. Komponen non-terminal → komponen yang sering
C. Teori Sintaks Token adalah sebuah bagian dari string yang dipecah
menjadi beberapa kata. Contoh: sebuah string berisi
Definisi sintaks menurut situs “Aplikasi rekursif untuk analisis sintaks” dapat
http://literarydevices.net/syntax/ adalah kumpulan aturan menghasilkan token yang berisi “aplikasi”, “rekursif”,
yang mendikte bagaimana kata-kata dalam sebuah bahasa “untuk”, “analisis”, dan “sintaks”. Tidak hanya itu, token
saling berhubungan dengan cara memperhatikan urutan dapat dibentuk dengan memanfaatkan sebuah karakter
sehingga bahasa tersebut dapat dikomunikasikan. yang dinamanakan delimiter. Delimiter ini nantinya akan
Berikut adalah contoh sintaks yang digunakan di bahasa berfungsi sebagai karakter batasan yang menjadi penanda
4) Sintaks IF-THEN-ELSE
A. Pengenalan Sintaks → if (kondisi) then
→ begin
Dalam makalah ini, jenis bahasa pemrograman yang →…
akan dijadikan bahan untuk implementasi adalah bahasa → end
Pascal-like, yang mana artinya bahasa ini memiliki → else
kemiripan sintaks dengan bahasa pemrograman Pascal. → begin
Pembatasan lainnya adalah bahwa kita hanya akan →…
melakukan pengecekan validitas sintaks pada algoritma → end
utama, tanpa melihat kebenaran sintaks pada bagian kamus Rincian sintaks yang valid untuk IF-THEN-
atau header program lainnya. ELSE sebenarnya sama seperti IF-THEN
Berikut adalah definisi sintaks yang dinyatakan valid pada poin 3, hanya saja setelah
bagi bahasa Pascal-like. menyatakan kalau blok IF-THEN adalah
1) Awalan algoritma utama valid, maka dilakukan pengecekan terhadap
→ begin ... end kasus ELSE. Kasus ELSE dinyatakan valid
Bagian algoritma utama harus diawali jika setelah identifier else ditemukan
identifier begin dan diakhiri identifier end, identifier begin yang diakhiri oleh end. Di antara
dimana di antara kedua identifier begin dan end tersebut adalah blok
tersebut berisi sebuah blok program program yang akan dieksekusi oleh kasus
atau mungkin juga kosong. ELSE tersebut. Pengecekan tambahan bagi
2) Sintaks operasi matematika dan relasi ELSE yaitu sebelum ELSE harus ada kondisi
→ <expression> <operator> <expression> IF-THEN, dan ELSE hanya boleh muncul
Bagian operasi matematika ditandai oleh identifier sekali setelah IF-THEN.
seperti +, -, *, dan = (operator khusus
bilangan bulat). Bagian relasi dinyatakan 5) Sintaks DO-WHILE
oleh identifier <, >, <>, <=, dan >=. Sintaks → do
yang valid untuk masing- masing →…
operator tersebut (baik operasi matematika → while (kondisi)
maupun relasi) adalah pada kedua sisi kiri Bagian DO-WHILE diproses validitasnya dengan
dan kanannya harus berisi ekspresi yang cara setelah program menemukan identifier
bernilai valid juga. do, maka program akan mencari identifier while
3) Sintaks IF-THEN sebagai penanda akhir dari blok DO-
→ if (kondisi) then WHILE. Di antara do dan while tersebut
→ begin menjadi blok program yang akan
→… dijalankan oleh algoritma DO-WHILE
→ end tersebut. Setelah ditemukan identifier
Rincian sintaks yang valid untuk IF-THEN adalah while, maka dilakukan pengecekan terhadap
bahwa setelah ditemukan identifier IF, maka sintaks kondisi while, misalnya terdapat kode
selanjutnya dilakukan pengecekan terhadap “while (a <= 9)”, maka sintaks kondisi yang
kondisi yang diinginkan. Misalkan: if harus dicek adalah “(a <= 9)”.
(a=1) then, maka kondisi yang diinginkan Pengecekan sintaks kondisi ini sekali lagi
tersebut adalah (a=1) yang mana dapat memanfaatkan prosedur yang sama
termasuk ke dalam bagian sintaks seperti poin 2.
operasi matematika. Untuk melakukan
pengecekan sintaks kondisi itu, kita dapat 6) Sintaks FOR
E. Fungsi BLOCK
D. Fungsi START
Masih di dalam fungsi IF, setelah semua blok program Potongan kode untuk fungsi DO di atas melakukan
IF-THEN dinyatakan valid, maka selanjutnya dicek apakah pengecekan terhadap isi blok program setelah identifier
terdapat identifier ELSE setelah nya. Jika ya, maka “do”. Cara kerjanya sedikit berbeda karena setelah
dipanggil kembali fungsi START untuk mengecek blok identifier “do” tidak ada identifier “begin”. Setelah isi blok
program di antara “begin” dan “end” untuk ELSE. Jika program setelah “do” dinilai valid, maka dilakukan
tidak ada ELSE, maka dilakukan prosedur yang sama pengecekan terhadap ekspresi kondisi yang dimiliki oleh
seperti gambar E.2. identifier “while” dimana bentuk sintaks ekspresi
kondisinya sama seperti IF, INPUT, OUTPUT, dan FOR.
Yang menarik adalah terdapat algoritma fungsi yang Setelah itu dilakukan prosedur yang sama seperti gambar
mirip antara beberapa jenis identifier seperti antara IF dan E.2.
FOR, dimana identifier “then” pada IF disamakan dengan
identifier “do” pada FOR. Setelah itu kedua identifier Berikut adalah potongan kode program untuk fungsi EXP
memiliki bagian “begin” dan “end”. yang memanfaatkan struktur data STACK.
IV. KESIMPULAN
V. REFERENSI
[1] http://www.programcreek.com/2011/02/how-compiler-
works/
Akses: Sabtu 5 Desember 2015 jam 22.09
[2] https://polidamar.wordpress.com/bahasa-c/menghitung-
faktorial-dengan-bahasa-c/
Akses: Minggu, 6 Desember 2015 jam 11.35
[3]https://www.cs.rochester.edu/~nelson/courses/csc_173/gr
ammars/cfg.html
Akses: Minggu, 6 Desember 2015 jam 11.40