CFG & CFL
CONTEXT-FREEGRAMMAR-CONTEXT-FREELANGUAGE
STIKOM Artha Buana
Teknik Informatika
2014
Ir. Ahmad Haidaroh, M.Kom.
Fakta
• Tidak semua bahasa merupakan bahasa
regular (bahasa yg diluar aturan)
• Perlu kelas bahasa yang lebih besar
CFL
• Context-Free Language (CFL) digunakan
dalam bahasa
• Bahasa alami sejak 1950
• Compiler sejak 1960
• CFL digunakan dalam XML (Extensible
Markup Language)
Motivasi awal
• deskripsi bahasa alami
<kalimat>  <subjek> <predikat>
<subjek>  <kata benda>
<predikat>  <kata kerja>
<kata benda>  kucing
<kata kerja>  berlari
<kata kerja>  menyapu
Kalimat yg dihasilkan
• kucing berlari  benar
• kucing menyapu sintaks yes, semantik no
• Daniel belajar  benar
• Sapi menulis  sintak yes, semantik no
Manfaat CFG pada bidang Komputer
• Mendeskripsikan aturan tata bahasa suatu
bahasa pemrograman (seperti : Java, C, Pascal,
Basic)
Contoh Java
package helloword;public class HelloWord
{ public static void main(String[] args)
{ int suhu;
suhu = 37;
String _nama = "justin";
float $massa = 55.3f;
float $matti = 500000.3f;
float ff= 21.25f; // mengambil nilai desimal
int ii = (int) ff;
ff = ff - ii;
System.out.println(ff);
int hasil = (int)$matti; //float ke integer
$matti = hasil;
//klo dari int ke float --> langsung
System.out.println(hasil);
System.out.println(suhu + " " + $massa + _nama); // konversi dari numerik ke string
String strMassa = $massa + ""; //float ke string
System.out.println(strMassa);
float massa =Float.parseFloat(strMassa); //konversi dari string ke float
int panjang = Integer.parseInt("12"); //konversi dari string ke integer
}
}
Contoh C++
# include "stdafx.h"
void main()
{
for(int x=0;x<=9;x++)
{
WriteLine(x);
}
}
Console VB.Net
Module Module1
Sub Main()
Dim a As String
Dim s1 As Integer
Dim s2 As Integer
Dim s3 As Integer
Dim t As Double
Dim luas As Double
a = "hello apa kabar ?"
Dim b As Byte
b = 100
Console.WriteLine(a)
Console.WriteLine(b)
Console.Write("Input s1 = ")
s1 = Console.ReadLine()
Console.Write("Input s2 = ")
s2 = Console.ReadLine()
Console.Write("Input s3 = ")
s3 = Console.ReadLine()
t = (s1 + s2 + s3) / 3
luas = Math.Sqrt(t*Math.Abs(t-s1) * Math.Abs(t - s2) _
* Math.Abs(t - s3))
Console.Write("Luas area = ")
console.writeline(luas)
Console.ReadLine()
End Sub
End Module
Aturan CFG
• Ruas kiri dari aturan produksi terdiri dari SATU
simbol non terminal
• Ruas kanan dapat berupa string yang dibentuk
dari simbol terminal dan non terminal
• Contoh
S  aSb | 
Kalimat2 yg dihasilkan : , ab, aabb, aaabbb,
….,an bn
• Tanda  dibaca “diturunkan menjadi”
Definisi FormalCFG
CFG dituliskan dalam bentuk 4 komponen (4-
tupel)
G = (N, , P, S)
N = himpunan nonterminal.
 = himpunan terminal/ alfabet
P = aturan produksi, yakni A  
dengan A  N,   (N  )*
S = simbol awal
PenurunanString (Derivation)
• Dalam suatu grammar G, suatu string yang
mengandung simbol nonterminal (1) dapat
menurunkan bentuk terminal (m).
• Dituliskan dengan 1 * m.
• Seluruh sentence dapat membentuk suatu
bahasa, yang dinotasikan dengan L(G)
• L(G) = { w | w dalam *, dan S *w}
CFL (Context-Free Language)
• Seluruh sentence (ingat materi Teori Bahasa)
dapat membentuk suatu bahasa, yang
dinotasikan dengan L(G)
• L(G) = { w | w dalam *, dan S *w}
Bahasa dari suatu grammar (G) adalah seluruh
sentence
yang terdiri dari alfabet dalam G, dan diturunkan dari
simbol awal S
G = ({S}, {a,b}, P, S)
Dengan P adalah:
• S  aSb
• S  ab
Maka,
Turunan yang dihasilkan:
S  aSb  aabb
S  aSb  aaSbb  aaabbb
S  aSb  aaSbb  aaaSbbb  aaaabbbb
Contoh
Contoh (lanjutan): Penurunan
Turunan yang dihasilkan:
S  aSb  aabb
S  aSb  aaSbb  aaabbb
S  aSb  aaSbb  aaaSbbb  aaaabbbb
Dituliskan dalam bentuk L(G)
L(G) = {anbn | n ≥ 1}
jumlah ‘a’ dan ‘b’ sama
Contoh
G={(A),{0,1,a},P,S}
P-nya adalah :
A  0A0
A  1A1
A  a
Kalimat-kalimat yang dibangkitkan dari aturan
produksi itu adalah : a,01A10, 1001A1001 ,
110a011,…. R aR
• CFL yang terbentuk adalah :
L(G)={𝜷na𝜷n | n≥0}
Contoh CFG
• L(G)={𝛽na𝛽n | n≥0}
• Lpal = {otto, makam, madamimadam, …}
Production Rule
• Pada RG (Regular Grammar) digunakan tabel
transisi.
• Pada CFG digunakanlah Production Rule.
Production Rule
• Untuk  = {0,1}
• Production Rule Palindromnya:
P  
P  0
P  1
P  0P0
P  1P1
Quadruple CFG
• Pada FSA, digunakan 5-tuple
• Pada CFG, digunakan 4-tuple (quadruple)
Contoh Penurunan Produksi
Production berikut milik sebuah CFG
1. P → 0P0
2. P → 1P1
3. P → 0
4. P → 1
5. P → ε
Derivasi yang dapat dibentuk diantaranya
P ⇒ 1P1 ⇒ 10P01 ⇒ 101P101 ⇒ 101101
sentential form 1P1 diturunkan dari sentential form P
berdasarkan production 2.
sentential form 10P01 diturunkan dari sentential form 1P1
berdasarkan production 1.
Production berikut milik sebuah CSG
1. P → 0P0
2. 0P → 01P1
3. P → 0
4. P → 1
5. P → ε
Derivasi yang dapat dibentuk diantaranya
P ⇒ 0P0 ⇒ 01P10 ⇒ 01110
Production nomor 2, 0P → 01P1, menyatakan simbol P
boleh diderivasi dengan 1P1 hanya jika P berada di dalam
konteks tertentu yaitu di sebelah kiri P terdapat simbol 0.
Jadi P tidak free diderivasi menjadi 1P1, maksudnya tidak
bisa membentuk derivasi P ⇒ 1P1 ⇒ 11P11 ⇒ 1111
Contoh Penurunan Produksi
Aturan Produksi
Sepaham dengan namanya, production pada
CFG mempunyai susunan body (simbol-simbol di
kanan tanda panah) yang bebas, tidak ada
ketentuan tentang jenis dan jumlah simbol
pembentuk body suatu production.
Terlalu bebasnya bentuk production CFG akan
merepotkan implementasi.
1. P → 0P0
2. 0P → 01P1
3. P → 0
4. P → 1
5. P → ε
Eliminasi Useless Production
Apakah semua production suatu CFG memang berguna
(usefull) ?
Simbol X pada grammar G = (V,T, P, S) disebut berguna
jika terdapat derivasi S αXβ w dengan w terdiri atas
simbol terminal.
Dua persyaratan harus dipenuhi X untuk dianggap
berguna:
1. generating, yaitu X w
maksudnya X dapat menghasilkan minimum satu buah
string
2. reachable, yaitu S αXβ
maksudnya dimulai dari start symbol harus bisa
dihasilkan derivasi yang mengandung X

*

*

*

*
Uji generating
Apakah production berikut usefull?
1. S → aSa
2. S → Abd
3. S → Bde
4. A → Ada
5. B → BBB
6. B→ a
dengan menggunakan production 6 diperoleh B ⇒ a, artinya B generating.
dengan menggunakan production 3 diperoleh S ⇒ Bde
pada derivasi berikut kita akan menggantikan simbol B
karena B generating (B menurunkan a yg merupakan terminal) maka S
generating
dengan menggunakan production 4 diperoleh A ⇒ Ada ⇒ Adada
jika derivasi ini diteruskan maka tidak akan menghasilkan string karena
simbol A (bukan merupakan terminal) tidak bisa diganti dengan simbol
terminal, A tidak generating,
Agar useful, mama :
Production yang mengandung A dibagian head atau body dibuang,
diperoleh (2 dan 4)
1. S → aSa
3. S → Bde
5. B → BBB
6. B→ a
Uji generating
Uji reachable
S ⇒ Bde artinya B reachable dari S (mengapa ? Karena
B berisi a yg merupakan terminal dan bisa menjangkau
S)
Hasil:
1. S → aSa
2. S → Bde
3. B → BBB
4. B→ a
Eliminasi e-Production
Di dalam CFG mungkin terdapat -production, production berbentuk
A → .
Production ini bermanfaat untuk membentuk empty string atau untuk
mengakhiri suatu pengulangan.
Production di bawah ini :
1. P → 0P0
2. P → 1P1
3. P → 0
4. P → 1
5. P → 
menggunakan P → e untuk membentuk empty string (P ⇒ ) dan mengakhiri
pengulangan pada P ⇒ 0P0 ⇒ 00.
Jika sebuah language L mempunyai grammar CFG maka L – {}
mempunyai CFG yang tidak mengandung  -production.
Menghilangkan  -production pada CFG diawali dengan mendeteksi variabel
yang nullable.
Sebuah simbol non terminal atau variabel A disebut nullable jika A .
Apabila A muncul pada body production misalnya B → CAD maka
production ini diubah menjadi dua versi, satu dengan A dan yang lain tanpa
A.

*
Hilangkan  -production di bawah ini
1. S → aAb
2. A → aAb
3. A → 
Eliminasi  -Production
Contoh string yang dihasilkan dari production di atas:
1) S ⇒ aAb ⇒ ab production 1, 3
2) S ⇒ aAb ⇒ aaAbb ⇒ aabb production 1, 2, 3
3) S ⇒ aAb ⇒ aaAbb ⇒ aaaAbbb ⇒ aaabbb production 1, 2, 2, 3
Dengan menggunakan production 3 diperoleh A ⇒ , artinya A nullable
Apakah S nullable ? S ⇒ aAb ⇒ ab, artinya S tidak nullable (krn turunannya
tdk kosong)
Pada production S → aAb terdapat sebuah simbol nullable yaitu A,
Bentuk dua production:
S → aAb
S → ab
Pada production A → aAb terdapat sebuah simbol nullable yaitu A,
Bentuk dua production:
A → aAb
A → ab
Hasil:
1. S → aAb
2. S → ab
3. A → aAb
4. A → ab
Contoh string yang dihasilkan dari keempat production tersebut:
1) S ⇒ ab production 2
2) S ⇒ aAb ⇒ aabb production 1, 4
3) S ⇒ aAb ⇒ aaAbb ⇒ aaabbb production 1, 3, 4
XML (Extensible Markup Language)
adalah bahasa markup untuk keperluan umum yang
disarankan oleh W3C untuk membuat dokumen
markup keperluan pertukaran data antar sistem yang
beraneka ragam.[1] XML merupakan kelanjutan dari
HTML (HyperText Markup Language) yang merupakan
bahasa standar untuk melacak Internet.[2]
<?xml version="1.0" encoding="UTF-8"?>
<Resep nama="roti" waktu_persiapan="5 menit" waktu_masak="3 jam">
<judul>Roti tawar</judul> <bahan jumlah="3" satuan="cangkir">tepung</bahan>
<bahan jumlah="0,25" satuan="ons">ragi</bahan> <bahan jumlah="1,5"
satuan="cangkir">air hangat</bahan> <bahan jumlah="1" satuan="sendok
teh">garam</bahan>
<Cara_membuat>
<langkah>Campur semua bahan dan uleni adonan sampai merata </langkah>
<langkah>Tutup dengan kain lembap dan biarkan selama satu jam di ruangan
yang hangat.</langkah>
<langkah>Ulangi lagi, letakkan di loyang dan panggang di oven.</langkah>
<langkah>Keluarkan, hidangkan</langkah>
</Cara_membuat>
</Resep>
BACK

Context Free Grammar 1 - Materi 6 - TBO

  • 1.
    CFG & CFL CONTEXT-FREEGRAMMAR-CONTEXT-FREELANGUAGE STIKOMArtha Buana Teknik Informatika 2014 Ir. Ahmad Haidaroh, M.Kom.
  • 2.
    Fakta • Tidak semuabahasa merupakan bahasa regular (bahasa yg diluar aturan) • Perlu kelas bahasa yang lebih besar
  • 3.
    CFL • Context-Free Language(CFL) digunakan dalam bahasa • Bahasa alami sejak 1950 • Compiler sejak 1960 • CFL digunakan dalam XML (Extensible Markup Language)
  • 4.
    Motivasi awal • deskripsibahasa alami <kalimat>  <subjek> <predikat> <subjek>  <kata benda> <predikat>  <kata kerja> <kata benda>  kucing <kata kerja>  berlari <kata kerja>  menyapu
  • 5.
    Kalimat yg dihasilkan •kucing berlari  benar • kucing menyapu sintaks yes, semantik no • Daniel belajar  benar • Sapi menulis  sintak yes, semantik no
  • 6.
    Manfaat CFG padabidang Komputer • Mendeskripsikan aturan tata bahasa suatu bahasa pemrograman (seperti : Java, C, Pascal, Basic)
  • 7.
    Contoh Java package helloword;publicclass HelloWord { public static void main(String[] args) { int suhu; suhu = 37; String _nama = "justin"; float $massa = 55.3f; float $matti = 500000.3f; float ff= 21.25f; // mengambil nilai desimal int ii = (int) ff; ff = ff - ii; System.out.println(ff); int hasil = (int)$matti; //float ke integer $matti = hasil; //klo dari int ke float --> langsung System.out.println(hasil); System.out.println(suhu + " " + $massa + _nama); // konversi dari numerik ke string String strMassa = $massa + ""; //float ke string System.out.println(strMassa); float massa =Float.parseFloat(strMassa); //konversi dari string ke float int panjang = Integer.parseInt("12"); //konversi dari string ke integer } }
  • 8.
    Contoh C++ # include"stdafx.h" void main() { for(int x=0;x<=9;x++) { WriteLine(x); } }
  • 9.
    Console VB.Net Module Module1 SubMain() Dim a As String Dim s1 As Integer Dim s2 As Integer Dim s3 As Integer Dim t As Double Dim luas As Double a = "hello apa kabar ?" Dim b As Byte b = 100 Console.WriteLine(a) Console.WriteLine(b) Console.Write("Input s1 = ") s1 = Console.ReadLine() Console.Write("Input s2 = ") s2 = Console.ReadLine() Console.Write("Input s3 = ") s3 = Console.ReadLine() t = (s1 + s2 + s3) / 3 luas = Math.Sqrt(t*Math.Abs(t-s1) * Math.Abs(t - s2) _ * Math.Abs(t - s3)) Console.Write("Luas area = ") console.writeline(luas) Console.ReadLine() End Sub End Module
  • 10.
    Aturan CFG • Ruaskiri dari aturan produksi terdiri dari SATU simbol non terminal • Ruas kanan dapat berupa string yang dibentuk dari simbol terminal dan non terminal • Contoh S  aSb |  Kalimat2 yg dihasilkan : , ab, aabb, aaabbb, ….,an bn • Tanda  dibaca “diturunkan menjadi”
  • 11.
    Definisi FormalCFG CFG dituliskandalam bentuk 4 komponen (4- tupel) G = (N, , P, S) N = himpunan nonterminal.  = himpunan terminal/ alfabet P = aturan produksi, yakni A   dengan A  N,   (N  )* S = simbol awal
  • 12.
    PenurunanString (Derivation) • Dalamsuatu grammar G, suatu string yang mengandung simbol nonterminal (1) dapat menurunkan bentuk terminal (m). • Dituliskan dengan 1 * m. • Seluruh sentence dapat membentuk suatu bahasa, yang dinotasikan dengan L(G) • L(G) = { w | w dalam *, dan S *w}
  • 13.
    CFL (Context-Free Language) •Seluruh sentence (ingat materi Teori Bahasa) dapat membentuk suatu bahasa, yang dinotasikan dengan L(G) • L(G) = { w | w dalam *, dan S *w} Bahasa dari suatu grammar (G) adalah seluruh sentence yang terdiri dari alfabet dalam G, dan diturunkan dari simbol awal S
  • 14.
    G = ({S},{a,b}, P, S) Dengan P adalah: • S  aSb • S  ab Maka, Turunan yang dihasilkan: S  aSb  aabb S  aSb  aaSbb  aaabbb S  aSb  aaSbb  aaaSbbb  aaaabbbb Contoh
  • 15.
    Contoh (lanjutan): Penurunan Turunanyang dihasilkan: S  aSb  aabb S  aSb  aaSbb  aaabbb S  aSb  aaSbb  aaaSbbb  aaaabbbb Dituliskan dalam bentuk L(G) L(G) = {anbn | n ≥ 1} jumlah ‘a’ dan ‘b’ sama
  • 16.
    Contoh G={(A),{0,1,a},P,S} P-nya adalah : A 0A0 A  1A1 A  a Kalimat-kalimat yang dibangkitkan dari aturan produksi itu adalah : a,01A10, 1001A1001 , 110a011,…. R aR • CFL yang terbentuk adalah : L(G)={𝜷na𝜷n | n≥0}
  • 17.
    Contoh CFG • L(G)={𝛽na𝛽n| n≥0} • Lpal = {otto, makam, madamimadam, …}
  • 18.
    Production Rule • PadaRG (Regular Grammar) digunakan tabel transisi. • Pada CFG digunakanlah Production Rule.
  • 19.
    Production Rule • Untuk = {0,1} • Production Rule Palindromnya: P   P  0 P  1 P  0P0 P  1P1
  • 20.
    Quadruple CFG • PadaFSA, digunakan 5-tuple • Pada CFG, digunakan 4-tuple (quadruple)
  • 21.
    Contoh Penurunan Produksi Productionberikut milik sebuah CFG 1. P → 0P0 2. P → 1P1 3. P → 0 4. P → 1 5. P → ε Derivasi yang dapat dibentuk diantaranya P ⇒ 1P1 ⇒ 10P01 ⇒ 101P101 ⇒ 101101 sentential form 1P1 diturunkan dari sentential form P berdasarkan production 2. sentential form 10P01 diturunkan dari sentential form 1P1 berdasarkan production 1.
  • 22.
    Production berikut miliksebuah CSG 1. P → 0P0 2. 0P → 01P1 3. P → 0 4. P → 1 5. P → ε Derivasi yang dapat dibentuk diantaranya P ⇒ 0P0 ⇒ 01P10 ⇒ 01110 Production nomor 2, 0P → 01P1, menyatakan simbol P boleh diderivasi dengan 1P1 hanya jika P berada di dalam konteks tertentu yaitu di sebelah kiri P terdapat simbol 0. Jadi P tidak free diderivasi menjadi 1P1, maksudnya tidak bisa membentuk derivasi P ⇒ 1P1 ⇒ 11P11 ⇒ 1111 Contoh Penurunan Produksi
  • 23.
    Aturan Produksi Sepaham dengannamanya, production pada CFG mempunyai susunan body (simbol-simbol di kanan tanda panah) yang bebas, tidak ada ketentuan tentang jenis dan jumlah simbol pembentuk body suatu production. Terlalu bebasnya bentuk production CFG akan merepotkan implementasi. 1. P → 0P0 2. 0P → 01P1 3. P → 0 4. P → 1 5. P → ε
  • 24.
    Eliminasi Useless Production Apakahsemua production suatu CFG memang berguna (usefull) ? Simbol X pada grammar G = (V,T, P, S) disebut berguna jika terdapat derivasi S αXβ w dengan w terdiri atas simbol terminal. Dua persyaratan harus dipenuhi X untuk dianggap berguna: 1. generating, yaitu X w maksudnya X dapat menghasilkan minimum satu buah string 2. reachable, yaitu S αXβ maksudnya dimulai dari start symbol harus bisa dihasilkan derivasi yang mengandung X  *  *  *  *
  • 25.
    Uji generating Apakah productionberikut usefull? 1. S → aSa 2. S → Abd 3. S → Bde 4. A → Ada 5. B → BBB 6. B→ a dengan menggunakan production 6 diperoleh B ⇒ a, artinya B generating. dengan menggunakan production 3 diperoleh S ⇒ Bde pada derivasi berikut kita akan menggantikan simbol B karena B generating (B menurunkan a yg merupakan terminal) maka S generating dengan menggunakan production 4 diperoleh A ⇒ Ada ⇒ Adada jika derivasi ini diteruskan maka tidak akan menghasilkan string karena simbol A (bukan merupakan terminal) tidak bisa diganti dengan simbol terminal, A tidak generating,
  • 26.
    Agar useful, mama: Production yang mengandung A dibagian head atau body dibuang, diperoleh (2 dan 4) 1. S → aSa 3. S → Bde 5. B → BBB 6. B→ a Uji generating
  • 27.
    Uji reachable S ⇒Bde artinya B reachable dari S (mengapa ? Karena B berisi a yg merupakan terminal dan bisa menjangkau S) Hasil: 1. S → aSa 2. S → Bde 3. B → BBB 4. B→ a
  • 28.
    Eliminasi e-Production Di dalamCFG mungkin terdapat -production, production berbentuk A → . Production ini bermanfaat untuk membentuk empty string atau untuk mengakhiri suatu pengulangan. Production di bawah ini : 1. P → 0P0 2. P → 1P1 3. P → 0 4. P → 1 5. P →  menggunakan P → e untuk membentuk empty string (P ⇒ ) dan mengakhiri pengulangan pada P ⇒ 0P0 ⇒ 00. Jika sebuah language L mempunyai grammar CFG maka L – {} mempunyai CFG yang tidak mengandung  -production.
  • 29.
    Menghilangkan  -productionpada CFG diawali dengan mendeteksi variabel yang nullable. Sebuah simbol non terminal atau variabel A disebut nullable jika A . Apabila A muncul pada body production misalnya B → CAD maka production ini diubah menjadi dua versi, satu dengan A dan yang lain tanpa A.  * Hilangkan  -production di bawah ini 1. S → aAb 2. A → aAb 3. A →  Eliminasi  -Production Contoh string yang dihasilkan dari production di atas: 1) S ⇒ aAb ⇒ ab production 1, 3 2) S ⇒ aAb ⇒ aaAbb ⇒ aabb production 1, 2, 3 3) S ⇒ aAb ⇒ aaAbb ⇒ aaaAbbb ⇒ aaabbb production 1, 2, 2, 3 Dengan menggunakan production 3 diperoleh A ⇒ , artinya A nullable Apakah S nullable ? S ⇒ aAb ⇒ ab, artinya S tidak nullable (krn turunannya tdk kosong)
  • 30.
    Pada production S→ aAb terdapat sebuah simbol nullable yaitu A, Bentuk dua production: S → aAb S → ab Pada production A → aAb terdapat sebuah simbol nullable yaitu A, Bentuk dua production: A → aAb A → ab Hasil: 1. S → aAb 2. S → ab 3. A → aAb 4. A → ab Contoh string yang dihasilkan dari keempat production tersebut: 1) S ⇒ ab production 2 2) S ⇒ aAb ⇒ aabb production 1, 4 3) S ⇒ aAb ⇒ aaAbb ⇒ aaabbb production 1, 3, 4
  • 31.
    XML (Extensible MarkupLanguage) adalah bahasa markup untuk keperluan umum yang disarankan oleh W3C untuk membuat dokumen markup keperluan pertukaran data antar sistem yang beraneka ragam.[1] XML merupakan kelanjutan dari HTML (HyperText Markup Language) yang merupakan bahasa standar untuk melacak Internet.[2] <?xml version="1.0" encoding="UTF-8"?> <Resep nama="roti" waktu_persiapan="5 menit" waktu_masak="3 jam"> <judul>Roti tawar</judul> <bahan jumlah="3" satuan="cangkir">tepung</bahan> <bahan jumlah="0,25" satuan="ons">ragi</bahan> <bahan jumlah="1,5" satuan="cangkir">air hangat</bahan> <bahan jumlah="1" satuan="sendok teh">garam</bahan> <Cara_membuat> <langkah>Campur semua bahan dan uleni adonan sampai merata </langkah> <langkah>Tutup dengan kain lembap dan biarkan selama satu jam di ruangan yang hangat.</langkah> <langkah>Ulangi lagi, letakkan di loyang dan panggang di oven.</langkah> <langkah>Keluarkan, hidangkan</langkah> </Cara_membuat> </Resep> BACK