Back to IF2224 Teori Bahasa Formal dan Otomata
1. Konsep Dasar Finite Automata (FA)
(a) Perbedaan DFA/NFA:
Jelaskan perbedaan utama antara fungsi transisi () pada DFA dan NFA!
- DFA → Transisi ke satu state
- NFA → Transisi bisa lebih dari satu state
(b) Tracing DFA:
Diberikan DFA berikut (, , ):
| State | 0 | 1 |
|---|---|---|
| B | A | |
| B | B | C |
| B | A |
Tentukan state akhir setelah DFA membaca string 10110! Apakah string tersebut diterima?
Bukan di final state → Ditolak
(c) Epsilon Closure:
Diberikan -NFA berikut:
-
-
-
= Start State
-
-
Transisi :
-
Hitunglah dan !
Cara cari ECLOSE: Masukin yang diminta ke himpunannnya. Liat ada transisi ke epsilon atau engga. Kalau ada, masukin next statenya
2. Ekuivalensi & Regular Expression (RE)
(a) Subset Construction:
Jelaskan ide utama di balik algoritma Subset Construction untuk mengubah NFA menjadi DFA! State baru di DFA merepresentasikan apa?
Subset Construction bertujuan untuk menghilangkan nondeterminisme di NFA. Satu state di DFA baru akan melambangkan himpunan state lama di NFA.
(b) Regular Expression:
Tuliskan Regular Expression (RE) untuk bahasa pada yang terdiri dari semua string yang:
-
Dimulai dengan ‘a’.
-
Diikuti oleh nol atau lebih ‘b’.
-
Diakhiri dengan ‘a’.
- Contoh string diterima: aa, aba, abba, abbba.
- Contoh string ditolak: a, b, ba, baa.
ab*a
3. Properties Bahasa Reguler
(a) Pumping Lemma:
Apa tujuan utama dari Pumping Lemma? Sebutkan 3 kondisi yang harus dipenuhi oleh pemecahan string dalam Pumping Lemma!
Jawaban:
Bertujuan utama menunjukkan bahwa sebuah bahasa BUKAN bahasa reguler.
3 Kondisi:
- |xy| < n
- |y| > 0
- Untuk setiap , berlaku
Untuk membuktikan bahasa bukan reguler menggunakan Pumping Lemma, string mana yang paling strategis untuk dipilih (dengan adalah pumping length)?
(i) (ii) (iii) (iv)
(ii). Ini bentuk umum string di L. Kalau kita pecah ke x, y, dan z, kan xy < n, berarti xy tuh pasti kumpulan string a.
Kita definisikan
Misalkan kita pilih :
Artinya tercipta string baru
Padahal, . Maka kontradiksi terjadi. L bukan bahasa reguler.
(b) Closure Properties:
Jika adalah bahasa reguler (diterima oleh DFA ) dan adalah bahasa reguler (diterima oleh DFA ), apakah bahasa (gabungan dan ) juga dijamin reguler? Jelaskan secara singkat mengapa!
Ya, dijamin reguler. Karena jika punya RE dan punya RE , maka memiliki RE , yang juga merupakan RE valid.
Diketahui dan . Keduanya adalah bahasa reguler. Apakah bahasa (string dengan jumlah 0 genap DAN jumlah 1 ganjil) juga reguler? Mengapa?
Ya, reguler. Karena kelas bahasa reguler tertutup (closed) terhadap operasi irisan (intersection).
(c) Minimasi DFA:
Apa tujuan dari minimasi DFA? Kriteria dasar apa yang digunakan oleh Algoritma Table-Filling untuk menandai pasangan state yang distinguishable (dapat dibedakan) pada langkah awalnya?
- Tujuan: Mendapatkan DFA dengan jumlah state paling sedikit yang menerima bahasa yang sama (efisien dan representasi standar).
- Kriteria Dasar (Basis): Menandai semua pasangan state di mana salah satunya adalah final state dan yang lainnya bukan final state. Pasangan ini jelas dapat dibedakan oleh string kosong ().
Perhatikan DFA berikut:
-
, ,
-
,
-
,
-
,
Gunakan Algoritma Table-Filling untuk menentukan state yang indistinguishable:
-
Identifikasi state Final (F) dan Non-Final (N).
-
Langkah Basis: Pasangan mana saja yang langsung ditandai (distinguishable) karena merupakan pasangan (F, N)?
-
Langkah Induksi: Periksa pasangan (A, B). Apakah dan mengarah ke pasangan yang sudah ditandai di langkah 2? Jika ya, tandai (A, B).
-
Kesimpulan: Pasangan state mana yang tersisa (tidak ditandai) sebagai indistinguishable?
- F = {C}, N = {A, B}
- (A, C) dan (B, C)
- (A, B)
- Tidak ada
4. Context-Free Grammar (CFG) & Parse Tree
(a) Definisi CFG:
Sebuah CFG didefinisikan sebagai . Jelaskan secara singkat apa arti dari masing-masing komponen !
- V = Variabel (Simbol non-terminal)
- T = Terminal (Simbol dasar)
- P = Production Rule (Cara ubah suatu Variabel jadi Variabel/Terminal)
- S = Simbol Awal (Tempat mulai derivasi)
(b) Derivasi:
Diberikan CFG berikut:
Lakukan leftmost derivation untuk menghasilkan string 011!
Mulai dari S S → 0A1 Pilih variabel paling kiri, A (dengan production rule A → 1A) S → 01A1 Ambil lagi variabel paling kiri (dengan production rule A → ) S → 01 1 = 011
(c) Parse Tree:
Gambarkan Parse Tree yang sesuai dengan derivasi yang kamu lakukan di soal (b)!
S
/ | \
0 A 1
| \
1 A
|
e
(d) Rekursif Kiri:
Apa masalah yang disebabkan oleh aturan produksi rekursif kiri (contoh: ) pada metode parsing top-down?
Menyebabkan parser masuk ke dalam loop tak terbatas (infinite loop). Parser akan terus mencoba mengekspansi variabel yang sama (misal ‘E’) tanpa pernah membaca input, karena pilihan pertama ekspansinya adalah memanggil dirinya sendiri lagi.
Cara Memperbaiki Rekursif Kiri (Contoh): Aturan rekursif kiri umumnya berbentuk: (di mana adalah bagian rekursif, dan adalah bagian non-rekursif yang tidak dimulai dengan A). Cara memperbaikinya adalah dengan mengubah aturan menjadi:
- (di mana adalah variabel baru).
Contoh Penerapan: Misalkan aturan asli:
- Identifikasi: , , .
- Terapkan transformasi:
Aturan baru ini menghasilkan bahasa yang sama tetapi tidak lagi rekursif kiri, sehingga aman untuk parser top-down.
(e) Ambiguitas:
Apa yang dimaksud dengan ambiguitas dalam Context-Free Grammar? Berikan contoh CFG yang ambigu dan tunjukkan ambiguitasnya untuk sebuah string!
Definisi: Sebuah CFG disebut ambigu jika terdapat setidaknya satu string dalam bahasanya yang memiliki lebih dari satu leftmost derivation ATAU lebih dari satu rightmost derivation ATAU lebih dari satu parse tree. Ini berarti struktur sintaksis string tersebut bisa diinterpretasikan dengan cara yang berbeda.
Contoh Grammar Ambigu (Ekspresi Aritmatika Sederhana):
String:
id + id * idAmbiguitas (Dua Leftmost Derivations):
- Derivasi 1 (Penjumlahan dulu): (Interpretasi: (id + id) * id)
- Derivasi 2 (Perkalian dulu): (Interpretasi: id + (id * id))
Karena ada dua leftmost derivation yang berbeda untuk string yang sama, grammar ini ambigu.
Cara Memperbaiki Ambiguitas (Menegakkan Precedence & Associativity): Ambiguitas pada grammar ekspresi biasanya diatasi dengan memperkenalkan level variabel yang berbeda untuk setiap tingkat precedence (prioritas operator) dan menggunakan rekursi untuk associativity (arah pengelompokan).
Grammar Tidak Ambigu (Perbaikan):
- (Expression: penjumlahan, precedence terendah, left-associative)
- (Term: perkalian, precedence lebih tinggi, left-associative)
- (Factor: unit dasar - identifier atau ekspresi dalam kurung, precedence tertinggi)
Dengan grammar ini, string
id + id * idhanya akan memiliki satu parse tree yang valid, yang secara paksa mengelompokkan perkalian terlebih dahulu:id + (id * id), sesuai aturan precedence matematika standar.
5. Konsep Dasar Compiler
(a) Fase Compiler:
Sebutkan tiga fase frontend dalam sebuah compiler! Apa input dan output dari masing-masing fase tersebut?
- Analisis Leksikal (Lexical Analysis / Scanning):
- Input: Urutan karakter kode sumber.
- Output: Urutan token (unit leksikal bermakna).
- Analisis Sintaksis (Syntax Analysis / Parsing):
- Input: Urutan token dari fase sebelumnya.
- Output: Parse Tree (Pohon Sintaks) atau struktur data serupa yang merepresentasikan struktur gramatikal kode.
- Analisis Semantik (Semantic Analysis):
- Input: Parse Tree dari fase Parsing
- Output: Annotated Parse Tree, Sinyal lolos/gagal
(b) Scanner & Token:
Apa tugas utama Scanner (Lexical Analyzer)? Apa yang dimaksud dengan token? Berikan contoh token dari kode if (x > 10)!
- Tugas Scanner: Membaca kode sumber karakter per karakter, mengelompokkannya menjadi unit leksikal (token), membuang whitespace dan komentar, dan melaporkan error leksikal.
- Token: Representasi abstrak dari satu unit leksikal, biasanya terdiri dari tipe token (misal: KEYWORD, IDENTIFIER, NUMBER) dan kadang nilai token (misal: nama identifier
x, angka10).
- Contoh Token dari
if (x > 10):KEYWORD(if),DELIMITER((),IDENTIFIER(x),OPERATOR(>),NUMBER(10),DELIMITER())
(c) Parser & Grammar:
Apa tugas utama Parser (Syntax Analyzer)? Bagaimana hubungannya dengan Context-Free Grammar (CFG) dan Parse Tree?
Tugas Parser: Memeriksa apakah urutan token yang diterima dari scanner sesuai dengan aturan tata bahasa (grammar) dari bahasa pemrograman. Membangun representasi struktur sintaksis (biasanya Parse Tree). Melaporkan error sintaksis.
Hubungan: Parser menggunakan CFG sebagai definisi formal dari tata bahasa. Ia mencoba untuk membangun Parse Tree untuk urutan token input berdasarkan aturan-aturan dalam CFG tersebut. Jika Parse Tree berhasil dibangun, berarti kode secara sintaksis valid.