Back to Soal Latihan UAS TBFO
Problem Set Paket C: Studi Kasus Advanced Control Structures
Mata Kuliah: Teori Bahasa Formal dan Otomata / Teknik Kompilasi
Topik: Context-Free Grammar pada Konstruksi Bahasa Pemrograman
Fokus: Recursive Descent Parsing, Ambiguity, & Control Flow Analysis
Total Soal: 5 Soal (Berbasis Kasus Tunggal)
Deskripsi Kasus: The “Dangling Else” Problem
Kita memiliki sebuah Grammar yang mendefinisikan struktur percabangan (IF-THEN-ELSE) dan assignment sederhan- [ ] a.
Aturan Produksi (Grammar Rules):
-
STMTifEXPRthenSTMT -
STMTifEXPRthenSTMTelseSTMT -
STMTid:=num -
EXPRvar
Skenario:
Seorang compiler designer sedang menganalisis string input berikut:
if x then if y then a := 1 else a := 0
Berikut adalah Parse Tree (Pohon T) yang dihasilkan oleh parser untuk string tersebut:
graph TD; Root[STMT] --> If1[if]; Root --> Expr1[EXPR]; Root --> Then1[then]; Root --> StmtInner[STMT]; Expr1 --> Var1[x]; StmtInner --> If2[if]; StmtInner --> Expr2[EXPR]; StmtInner --> Then2[then]; StmtInner --> StmtAssign1[STMT]; StmtInner --> Else2[else]; StmtInner --> StmtAssign2[STMT]; Expr2 --> Var2[y]; StmtAssign1 --> Id1[a]; StmtAssign1 --> Assign1[:=]; StmtAssign1 --> Num1[1]; StmtAssign2 --> Id2[a]; StmtAssign2 --> Assign2[:=]; StmtAssign2 --> Num2[0];
Pertanyaan Studi Kasus
- Analisis Struktur Pohon & Grammar:
Berdasarkan pohon di atas, manakah pernyataan yang BENAR mengenai aturan produksi yang diterapkan pada simpul-simpulnya?
-
a. Simpul akar (Root) menggunakan aturan produksi nomor 2 (if-then-else).
-
b. Simpul akar (Root) menggunakan aturan produksi nomor 1 (if-then).
-
c. Simpul StmtInner menggunakan aturan produksi nomor 2 (if-then-else).
-
d. Pohon ini menunjukkan bahwa klausa else terikat (bind) dengan if yang paling luar (if x).
-
e. Pohon ini menunjukkan bahwa klausa else terikat dengan if yang paling dalam (if y).
- Interpretasi Logika Program (Semantik):
Jika kode ini dijalankan, bagaimanakah alur eksekusinya berdasarkan struktur pohon di atas?
-
a. Jika x bernilai false, maka a := 0 akan dieksekusi.
-
b. Jika x bernilai true DAN y bernilai false, maka a := 0 akan dieksekusi.
-
c. Perintah a := 0 adalah bagian dari blok Else milik if y.
-
d. Perintah a := 0 adalah bagian dari blok Else milik if x.
-
e. Struktur pohon ini merepresentasikan logika: “Jika x benar, maka cek y. Jika y salah, set a=0”.
- Implementasi Recursive Descent Parser:
Jika kita memodelkan parser kode ini menggunakan fungsi rekursif parseStmt(), manakah langkah-langkah yang tercermin dari pohon ini?
-
a. Fungsi parseStmt dipanggil pertama kali untuk Root. Ia mencocokkan token if, memanggil parseExpr, mencocokkan then, lalu memanggil parseStmt lagi (untuk StmtInner).
-
b. Saat parseStmt dipanggil untuk StmtInner, ia mendeteksi keberadaan token else setelah body then selesai.
-
c. Fungsi parseStmt untuk Root mendeteksi token else sehingga ia memilih jalur produksi if-then-else.
-
d. Pohon ini menggambarkan strategi Greedy Binding atau Nearest Neighbor, di mana else dipasangkan dengan if terdekat yang belum punya pasangan.
-
e. Parser harus melakukan backtracking dari StmtAssign2 ke Root.
- Analisis Ambiguitas (Alternate Parse Tree):
Grammar di atas terkenal ambigu (Dangling Else Ambiguity). Jika kita menggambar pohon alternatif (Pohon ) untuk string yang sama, manakah karakteristik yang akan muncul?
-
a. Pada Pohon , Simpul Akar (Root) akan menggunakan aturan produksi nomor 2 (if-then-else).
-
b. Pada Pohon , StmtInner (anak dari Root) akan menggunakan aturan nomor 1 (if-then).
-
c. Pada Pohon , klausa else akan menjadi anak langsung dari Root.
-
d. Pohon akan memiliki Yield string yang berbeda dengan Pohon .
-
e. Pohon merepresentasikan logika: “Jika x salah, maka set a=0”.
- Tracing Leftmost Derivation:
Manakah langkah-langkah awal derivasi terkiri yang sesuai dengan struktur Pohon di atas?
-
a. STMT if EXPR then STMT
-
b. STMT if EXPR then STMT else STMT
-
c. … if x then STMT if x then if EXPR then STMT else STMT
-
d. … if x then STMT if x then if EXPR then STMT
-
e. Derivasi ini membuktikan bahwa else adalah bagian dari ekspansi variabel STMT yang kedua (kanan).
Kunci Jawaban & Pembahasan
1. Jawaban: b, c, e
-
Analisis:
-
Lihat Root: Anaknya hanya
if,EXPR,then,STMT. Tidak ada cabangelseyang keluar langsung dari Root. Jadi Root pakai aturan 1 (if-then). (Opsi b Benar, a Salah). -
Lihat StmtInner: Anaknya lengkap
if,EXPR,then,STMT,else,STMT. Jadi dia pakai aturan 2. (Opsi c Benar). -
Secara visual,
elsemenempel padaifkedua (inner/if y). (Opsi e Benar).
-
2. Jawaban: b, c, e
-
Analisis:
-
Karena
elsemilikif y, makaa:=0hanya jalan kalauif ydievaluasi (artinyaxharus true dulu) TAPIyternyata fals- [ ] e. (Opsi b & c Benar). -
Jika
xfalse, program langsung selesai (keluar dari Root), tidak kenaelse. (Opsi a Salah). -
Opsi e adalah rangkuman logika yang benar dari pohon ini.
-
3. Jawaban: a, b, d
-
Analisis:
-
Ini adalah simulasi cara kerja parser. Root memanggil fungsi untuk anak-anakny- [ ] a. Karena Root tidak punya
elsedi levelnya, dia memanggilparseStmtuntuk anak (inner). -
Di dalam
StmtInner, parser melihat adaelse, jadi dia lanjut parsing cabang els- [ ] e. -
Konsep “Else nempel ke If terdekat” disebut Nearest Neighbor atau Close Binding, yang merupakan standar di C/Java/Pascal untuk menangani ambiguitas ini.
-
4. Jawaban: a, b, c, e
-
Analisis:
-
Pohon Alternatif () adalah interpretasi di mana
elsemilikif x(Outer). -
Maka Root harus punya cabang
elseAturan 2. (Opsi a & c Benar). -
StmtInner(anak Root di cabang then) tidak punyaelselagi Aturan 1. (Opsi b Benar). -
Logikanya berubah drastis: Jika
xfalse, masukelse(a:=0). (Opsi e Benar). -
Yield (string input) tetap sama, hanya strukturnya bed- [ ] a. (Opsi d Salah).
-
5. Jawaban: a, c
-
Analisis:
-
Langkah 1: Harus sesuai Root. Root pakai
if-then(tanpa else). Jadiif EXPR then STMT. (Opsi a Benar). -
Langkah selanjutnya: Ganti
EXPRjadix. Lalu gantiSTMT(yang inner) menjadi bentukif-then-else. (Opsi c Benar).
-