Tantangan di bawah ini mengharuskan Anda untuk terbiasa dengan teori parser formal. Jika Anda tidak tahu apa pertanyaannya karena Anda tidak tahu apa arti istilah tersebut, tata bahasa bebas konteks dan set pertama / ikuti tercakup dalam banyak program universitas.
Saya dapat merekomendasikan kursus Stanford ini , khususnya materi 08 dan 09 (dari halaman 7). Saya telah mengekstraksi juga mengekstraksi lembar contekan dari selebaran ini - Saya sarankan siapa pun yang mencoba tantangan ini untuk membacanya .
Menulis sebuah program atau fungsi yang diberikan tata bahasa bebas konteks menemukan set ikuti dari setiap nonterminal. Secara informal, rangkaian follow dari nonterminal adalah serangkaian terminal dan $
(artinya end-of-input) yang dapat Anda temukan setelah terminal itu dalam kalimat yang valid.
Input diberikan sebagai string ASCII yang dapat dicetak atau larik jalur ASCII yang dapat dicetak. Anda dapat menampilkan set dalam format yang wajar, menggunakan $
(baik sebagai output literal, atau string di dalam set, dll) untuk menunjukkan akhir input. Anda dapat mengasumsikan bahwa input selalu valid sesuai dengan format di bawah ini.
Tata bahasa gratis konteks diberikan dengan cara yang sangat sederhana. Setiap baris berisi satu produksi. Setiap produksi adalah daftar simbol yang dipisahkan ruang. Terminal adalah serangkaian karakter yang dikelilingi oleh tanda kutip (misalnya '**'
). Untuk kesederhanaan Anda dapat mengasumsikan bahwa terminal tidak mengandung spasi, tetapi alangkah baiknya jika program Anda mengizinkannya. Nonterminal dapat berupa string apa pun yang tidak mengandung spasi atau $
. Produksi kosong (biasanya ditunjukkan dengan ε) hanyalah garis yang hanya berisi sisi kiri nonterminal. Baris pertama adalah produksi yang mendefinisikan simbol awal.
Sebagai contoh, tata bahasa berikut:
S → aSa | bSb | ε
Akan diberikan sebagai:
S 'a' S 'a'
S 'b' S 'b'
S
Contoh input / output:
In:
S 'a' S 'a'
S 'b' S 'b'
S
Out:
S {'a', 'b', $}
In:
S A B C
A 'a'
A C 'b'
A
B C
B 'd' A
B
C 'e'
C 'f'
Out:
S {$}
A {'d', 'e', 'f'}
B {'e', 'f'}
C {'b', 'e', 'f', $}
In:
Start Alice Bob
Alice Charlie 'a'
Alice
Bob Bob 'a' Alice Charlie
Bob '!!!'
Charlie 'b'
Charlie
Out:
Start {$}
Alice {'a', '!!!', 'b', $}
Bob {'a', $}
Charlie {'a', $}
Kode terpendek dalam byte menang.