Chomsky Type-I(コンテキスト依存)文法を使用する実際のユースケースとは


9

最近、チョムスキー階層に言語パーサーがどのように適合するかという文脈で言語パーサーの開発を探究し、楽しんでいます。

文脈依存文法の実例(理論的ではない)の良い例は何ですか?


8
プログラミング言語は重要ですか?
マーティンヨーク

@LokiAstariもちろんです。
エヴァンプライス

2
プログラミング言語は重要だと思いますが、状況依存の複雑さは通常、代わりにセマンティック分析のある文脈自由文法に置き換えられるため、良い解決策にはなりません。
フランク

@フランク私の問題は、現実世界の使用法に適用せずに文脈依存言語が何であるかを本当に理解できないことだと思います。
エヴァンプライス

再帰的に列挙可能な言語パーサーを必要とせず、タイプ1(文脈依存)の言語セットに分類される人間の言語がいくつかあります。 cs.virginia.edu/~evans/cs3102/?p=138

回答:


9

良い質問。コメントで述べたように、非常に多くのプログラミング言語は状況依存ですが、その状況依存は、多くの場合、解析フェーズでは解決されませんが、後のフェーズで解決されます。つまり、言語のスーパーセットは、コンテキストフリーの文法を使用して解析されます。そして、それらの解析ツリーのいくつかは、後でフィルターで除外されます。

ただし、これらの言語が状況依存ではないという意味ではないため、以下にいくつかの例を示します。


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" -->

面白い。XMLについて知っていました。XHTML 1.0仕様の背後にある動機は、状況に応じた例外をサポートする「奇妙なモード」のHTMLインタープリターから、よりクリーンなコンテキストフリーXMLへと導くことだったのではないかと思います。
エヴァンプレイス2014

@EvanPlaice私はあなたのコメントで混乱しています- 私の例で示したように、「クリーンXML」は状況依存です。

4
@MattFenwick私のXMLの例は、XMLがコンテキストフリーではない本当の理由を示していないと思います。その理由は、任意のタグ名が許可されるためです。特定のタグセットのみが許可されている場合、XMLはコンテキストフリーです。
Honza

@HonzaBrabecそうです-私は暗黙的に任意のタグ名が許可されていると仮定しました。私はその仮定を明確に述べるべきだった。指摘いただきありがとうございます!

3

私の知る限り、文脈依存文法は自然言語処理でのみ使用されます。プログラミング言語のインタープリターとコンパイラーは、複雑さが原因で(たとえ過去に何らかの試みが行われたとしても)コンテキストフリーの文法を解析しようとはしません。

たぶん、これらのライブラリの1つで実際の使用例を見つけることができます。

http://en.wikipedia.org/wiki/List_of_natural_language_processing_toolkits

http://opennlp.sourceforge.net/projects.html

http://nltk.org/

http://nlp.stanford.edu/nlp/javadoc/javanlp/


2
HTMLの「奇妙なモード」とコードプリプロセッサはどうでしょうか?
Evan Plaice 2013

2

状況依存文法は、プログラミング言語のセマンティクスの説明で使用されることがあります。おそらく、文脈依存文法の最も包括的な使用法は、Algol68言語定義でした。2レベルのコンテキストフリーグラマー(http://en.wikipedia.org/wiki/Two-level_grammarを参照)を使用して、Algol68プログラムの構文とセマンティクスの両方を記述しました。

私の同僚の何人かは、van Wijngaarden文法を使用して、Algol68の実装を指示しました(http://en.wikipedia.org/wiki/FLACCを参照)。

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