最近、チョムスキー階層に言語パーサーがどのように適合するかという文脈で言語パーサーの開発を探求し、楽しんでいます。
文脈依存文法の実例(理論的ではない)の良い例は何ですか?
良い質問。コメントで述べたように、非常に多くのプログラミング言語は状況依存ですが、その状況依存は、多くの場合、解析段階では解決されませんが、後の段階で解決されます。つまり、言語のスーパーセットは、文脈自由文法を使用して解析されます。そして、それらの解析ツリーのいくつかは、後でフィルターで除外されます。
ただし、これは、これらの言語が文脈依存ではないことを意味するわけではありません。そのため、以下にいくつかの例を示します。
Haskellでは、演算子として使用される関数を定義したり、それらの演算子の優先順位や結合性を定義したりできます。つまり、次のような演算子式の正しい解析ツリーを構築することはできません。
a @@ b @@ c ## d ## e
@@
と##
の優先順位/関連付けの宣言を既に解析していない限り:
infixr 8 @@
infixr 6 ##
2番目の例は Bencode です。これは、コンテンツにその長さのプレフィックスを付けるデータ言語です。
<length>:<contents>
この形式の問題は、「フィールド」のサイズを理解する唯一の方法は...文字列を解析することなので、状況依存のものがなければ解析することがほとんど不可能であることです。
3番目の例はXMLで、任意のタグ名が許可されていると想定しています。開始タグ名には対応する終了タグが必要です。
<hi>
<bye>
the closing tag has to match bye
</bye>
</hi> <!-- has to match "hi" -->
私が知っている限り、文脈依存文法は自然言語処理で使用されますonly。プログラミング言語のインタープリターとコンパイラーは、複雑さのためにコンテキストフリーの文法を解析しようとしません(たとえ過去に何らかの試みが行われたとしても)。
たぶん、これらのライブラリの1つで実際の使用例を見つけることができます。
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
状況依存文法は、プログラミング言語のセマンティクスの説明で使用されることがあります。おそらく、文脈依存文法の最も包括的な使用法は、ALGOL68言語定義でした。 ALGOL68プログラムの構文とセマンティクスの両方を説明するために、2レベルのコンテキストフリーグラマー( http://en.wikipedia.org/wiki/Two-level_grammar を参照)を使用しました。
同僚の何人かは、van Wijngaardenの文法を使用してALGOL68の実装を指示しました( http://en.wikipedia.org/wiki/FLACC を参照)。