最近、チョムスキー階層に言語パーサーがどのように適合するかという文脈で言語パーサーの開発を探究し、楽しんでいます。
文脈依存文法の実例(理論的ではない)の良い例は何ですか?
最近、チョムスキー階層に言語パーサーがどのように適合するかという文脈で言語パーサーの開発を探究し、楽しんでいます。
文脈依存文法の実例(理論的ではない)の良い例は何ですか?
回答:
良い質問。コメントで述べたように、非常に多くのプログラミング言語は状況依存ですが、その状況依存は、多くの場合、解析フェーズでは解決されませんが、後のフェーズで解決されます。つまり、言語のスーパーセットは、コンテキストフリーの文法を使用して解析されます。そして、それらの解析ツリーのいくつかは、後でフィルターで除外されます。
ただし、これらの言語が状況依存ではないという意味ではないため、以下にいくつかの例を示します。
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" -->
私の知る限り、文脈依存文法は自然言語処理でのみ使用されます。プログラミング言語のインタープリターとコンパイラーは、複雑さが原因で(たとえ過去に何らかの試みが行われたとしても)コンテキストフリーの文法を解析しようとはしません。
たぶん、これらのライブラリの1つで実際の使用例を見つけることができます。
http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits
状況依存文法は、プログラミング言語のセマンティクスの説明で使用されることがあります。おそらく、文脈依存文法の最も包括的な使用法は、Algol68言語定義でした。2レベルのコンテキストフリーグラマー(http://en.wikipedia.org/wiki/Two-level_grammarを参照)を使用して、Algol68プログラムの構文とセマンティクスの両方を記述しました。
私の同僚の何人かは、van Wijngaarden文法を使用して、Algol68の実装を指示しました(http://en.wikipedia.org/wiki/FLACCを参照)。