Aşağıdaki setleri bulun


14

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.


4
İnsanların bağlamdan bağımsız bir dilbilgisinin ne olduğunu bildiklerini varsayarsak iyi olur, ancak bence sadece buraya bağlamak yerine tam bir takip seti tanımını eklerseniz meydan okumaya zarar vermez.
Martin Ender

1
Bu, birçok benzer görevi çözmek zorunda kaldığımız üniversitedeki " Derleyici İnşaat " dan bazı anıları geri getiriyor .
insertusernameburada

Yanıtlar:


3

Perl, 257 bayt

İçin +4 içerir -0p

STDIN'de dilbilgisi verin (sondaki boşluklar olmadan. İkinci örnekte fazladan boşluk kaldırdığınızdan emin olun). Terminal olmayan adların yalnızca harf, rakam ve içerdiğini varsayar _. Girişin sonunu belirtmek #yerine kullanır $. Boşluk içeren değişmezleri işleyebilir

perl -M5.010 follow.pl
E T e
e '+' T e
e
T F t
t '*' F t
t
F '(' E ')'
F 'id'
^D

Aşağıdaki kümeleri non-terminal literalbelirli bir sırayla bir liste olarak çıkarır. Yukarıdaki örnek için çıktı:

F ')'
F #
t ')'
t #
T ')'
T #
F '+'
t '+'
T '+'
F '*'
e ')'
e #
E ')'
E #

follow.pl:

#!/usr/bin/perl -0n
s/'.*?'/~$&/eg;s% (?=(\w.*\n))%$_.=">$1"%reg;/\s/;$_.=">$` #\n";s%^((\w+)\K ?\S*).*%$s{$1}++||"\$a.=s/ $2\\b/$&/rg"%eemgr,s%^(\w+ ).*?(\w+)$%"\$a.=s/>$1/>$2 /rg"%eermg,$_.=$a,s%>.*\xd8\K .*%%g,s%.+\n%$&x!/\n$&/g%eg until$$_++;s/\xd8.*?\xd8/~$&/eg;say/>(\w+ \W\S*\n)/g

Gösterilen, ancak onların yerini olarak çalışır \xd8ve \nonların edebi sürümleri tarafından talep edilen puanı almak için.

Kümeleri firstsetlere dönüştürmek followşu anda çok garip olduğu için bunu geliştirmek mümkün olmalıdır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.