私はコンパイラを学んでいますが、言語の文脈自由文法を作成する方法に悩んでいます。ほとんどの言語の文脈自由文法を作成するために従うことができる方法はありますか? 私はこの分野に不慣れなので、質問は基本的なものです。助けていただければ幸いです。
1 に答える
ほとんどの言語仕様には、特定の文法を設計するための基礎となる文法形式が付属しています。
特定の文法の必要性は、パーサー テクノロジの選択から生じます。あなたの文法は、そのパーサー技術の制限 (すべての制限があります) を尊重する必要があります。したがって、最初の質問は、「どのパーサー ジェネレーターを使用しますか?」ということになるはずです。(「none [recursive descent]」と主張する場合を含め、そのパーサージェネレーターを使用している理由を慎重に検討します (多くの場合、「最初に見つけたもの、またはマイキーが気に入っている)、どちらも腐った理由です。 . 特に, 特定のパーサー ジェネレーターを考慮した場合, 言語仕様自体を考慮して, パーサー ジェネレーターの欠点が問題になる可能性があるかどうかを判断できます. この選択は, 可能な答えの膨大なセットによってあまり助けられませんが, '
パーサー ジェネレーターを選択したら、言語仕様から文法形式を取り入れ、パーサー ジェネレーターの制限に合わせて曲げようとします。これは、あなたの「創造」作業のほとんどがどこから来るかです。小さな言語でこれを数回行った経験は、大規模で複雑な言語に直面したときに非常に役立ちます。
明白な参照文法のない言語を使用している場合、はるかに苦労します。さまざまな言語構造の文法規則と、それらの規則がどのように組み合わされてより大きなプログラム構造になるかを推測する必要があります。これがあなたが直面している問題である場合は、他の多くの実用的な文法を構築した経験があったほうがよいでしょう。(ここでの COBOL は本当に楽しいです。)
パーサー ジェネレーターが受け入れられるように見える文法を取得したら、パーサーを介してその言語のコードをできるだけ多く実行する必要があります。これは、文法の間違いや、標準文書の矛盾や誤解を明らかにするのに役立ちます。また、他のコンパイラによって処理された「あなたの言語」のソースコードには、他のコンパイラによって追加された多くの驚きが含まれている可能性があることもわかります。
幸運を。