フォローセットを見つける


14

以下の課題では、正式なパーサー理論に精通している必要があります。用語の意味が分からないために質問の内容がわからない場合は、多くの大学のコースで文脈自由文法とファースト/フォローセットが取り上げられています。

このスタンフォードコース、特に配布資料08と09(7ページから)をお勧めします。私はこれらの配布物からチートシートも抽出しました- この挑戦を試みる誰でもそれを読むことをお勧めします


文脈自由文法がすべての非終端記号の次のセットを見つけるプログラムまたは関数を記述します。非形式的には、非端末の次のセットは端末のセットであり、$(入力の終わりを意味します)有効な文でその端末の後に見つけることができます。

入力は、単一の印刷可能なASCII文字列または印刷可能なASCII行の配列として与えられます。$(リテラル出力、またはセット内の文字列などとして)入力の終わりを示すために使用して、任意の妥当な形式でセットを出力できます。以下の形式に従って、入力が常に有効であると想定できます。

文脈自由文法は非常に単純化された方法で与えられます。すべての行には単一の生産が含まれます。すべての制作物は、スペースで区切られたシンボルのリストです。ターミナルは、アポストロフィで囲まれた文字列です(例:)'**'。簡単にするために、端末にスペースが含まれていないと想定することもできますが、プログラムで許可されていると便利です。非終端記号は、スペースまたはを含まない任意の文字列です$。空の生成(通常はεで示されます)は、左側の非終端のみを含む単純な行です。最初の行は、開始記号を定義するプロダクションです。

例として、次の文法:

S→aSa | bSb | ε

として与えられます:

S 'a' S 'a'
S 'b' S 'b'
S

入力/出力の例:

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', $}

バイト単位の最短コードが優先されます。


4
文脈自由文法が何であるかを人々が知っていると仮定すると、私はそれを単にリンクするのではなく、ここにフォローセットの定義を含めても、挑戦を傷つけないと思います。
マーティンエンダー

1
これにより、大学の「Compiler Construction」から多くの思い出が持ち帰りました。そこでは、多くの同様のタスクを解決する必要がありました。
insertusernamehere

回答:


3

Perl、257バイト

+4を含む -0p

STDINに文法を付けます(末尾のスペースなし。2番目の例の余分なスペースは必ず削除してください)。非終端名には文字、数字、およびのみが含まれると想定し_ます。の#代わりに使用して$、入力の終わりを示します。スペースを含むリテラルを処理できます

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

以下のセットを、non-terminal literal順不同のリストとして出力します。上記の例では、次を出力します。

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

示すように動作しますが、交換する\xd8\n主張しスコアを取得するために彼らのリテラルバージョンで。

firstセットをセットに変換することfollowは現在非常に厄介なので、これを改善することができるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.