以下の課題では、正式なパーサー理論に精通している必要があります。用語の意味が分からないために質問の内容がわからない場合は、多くの大学のコースで文脈自由文法とファースト/フォローセットが取り上げられています。
このスタンフォードコース、特に配布資料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', $}
バイト単位の最短コードが優先されます。