Aşağıdaki zorluk, resmi ayrıştırıcı teorisine aşina olmanızı gerektirir. Sorunun ne istediğini bilmiyorsanız, terimlerin ne anlama geldiğini bilmiyorsanız, bağlamsız gramerler ve ilk / takip setleri birçok üniversite dersinde ele alınır.
Bu Stanford kursunu , özellikle 08 ve 09 ders notlarını (sayfa 7'den) tavsiye ederim . Ben de bu çalışma notlarından bir hile sayfası çıkardı - Ben okumak için bu meydan okuma girişiminde bulunan herkese tavsiye .
Bağlamdan bağımsız bir dilbilgisi verilen bir program veya işlevi yazın, her terminal olmayan öğenin aşağıdaki kümesini bulur. Gayri resmi olarak, bir terminal olmayan takip seti, $
geçerli bir cümlede bu terminalden sonra bulabileceğiniz bir dizi terminal ve (giriş sonu anlamına gelir).
Giriş, yazdırılabilir tek bir ASCII dizesi veya yazdırılabilir ASCII satır dizisi olarak verilir. $
Girdinin sonunu belirtmek için kümeleri makul bir biçimde (değişmez çıktı olarak veya bir kümenin içindeki dize vb.) Kullanarak çıktı alabilirsiniz. Girişin aşağıdaki formata göre daima geçerli olduğunu varsayabilirsiniz.
Bağlamdan bağımsız gramer çok basit bir şekilde verilmiştir. Her hat tek bir üretim içerir. Her üretim, boşlukla ayrılmış sembollerin listesidir. Terminal, kesme işaretleriyle çevrili bir karakter dizisidir (örn. '**'
). Basit olması için, terminallerin boşluk içermediğini varsayabilirsiniz, ancak programınız buna izin veriyorsa iyi olur. Bir terminal olmayan boşluk içermeyen herhangi bir dize veya olabilir $
. Boş üretim (normalde ε ile gösterilir) basitçe sadece sol tarafı terminalsiz içeren bir çizgidir. İlk satır, başlangıç sembolünü tanımlayan üretimdir.
Örnek olarak, aşağıdaki dilbilgisi:
S → aSa | bSb | ε
Aşağıdaki gibi verilecektir:
S 'a' S 'a'
S 'b' S 'b'
S
Örnek giriş / çıkışlar:
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', $}
Bayt cinsinden en kısa kod kazanır.