文脈自由文法にパラメータを追加するとどうなりますか?


13

私は、インデンテーションに敏感な言語の文法を考えていましたが、パラメータと組み合わせた場合、CF文法がトリックを行うようです。例として、ANTLRのような形式の単純化されたPython文法の次のフラグメントを考えます。

// on top-level the statements have empty indent
program  
    : statement('')+
    ;

// let's consider only one compound statement and one simple statement for now
statement(indent) 
    : ifStatement(indent)
    | passStatement(indent)
    ;

passStatement(indent)
    : indent 'pass' NEWLINE
    ;

// statements under if must have current indent plus 4 spaces
ifStatement(indent)
    : indent 'if' expression ':' NEWLINE (statement(indent '    ')+)
    ;

私の質問:この種の文法(パラメーター付きのCFG)には名前がありますか?

この文法の再帰降下パーサーを書くのは難しくないようです(パラメーターは基本的にパーサーでなければなりません)。このアプローチの難しさは何でしょうか?

パラメータを追加すると、サポートされている言語クラスがコンテキストフリーになりますか?


1
パラメーターが取ることができる値のセットが有限である場合、それはまだほとんど自由なコンテキストです(その後、すべての値を反復処理し、すべてを書き出すことができます)。
ラチェットフリーク

1
あなたの提案は、インデントが固定されたインデントに敏感な言語用であることに注意してください。Python(および他のそのような言語)は、このように制限されていません。ユーザーが望むあらゆるインデントを受け入れます。それは解析可能性に影響しません(タブ文字の処理を除く)が、少なくとも私が理解している限り、あなたの提案で表現するのは難しいでしょう。
リチ


@HendrikJan、属性文法は文法にセマンティックアクションを注釈する方法であり、構文解析を制御しません。
AProgrammer

1
インデントを処理することが目的であれば、パーサーよりもトークナイザーにより適しています。インデントレベルが変更されたときに、トークナイザーに仮想INDENTおよびUNINDENTトークンを発行させます。そうすれば、インデントに関する情報で言語文法を補強する必要はありません。
ジョンクーゲルマン

回答:


14

接辞文法(パラメータ化された文脈自由文法)は、著名なオランダのコンピューター科学者Cornelis HA Kosterによって広範に研究されました。1970年に、彼はこの概念の形式を作成しました。有用な概要は、1971年の彼の論文「プログラミング言語の接辞文法」にあります。これはCiteseerで見つけたものです

その論文では、Kosterは彼の形式(および別の類似の形式)をVan Wijngaardenの2レベルの文法と比較し、それらが非常に類似していることを発見しました。

解析技術に関する Dick Gruneの貴重な注釈付き参考文献には、接辞文法や他の非チョムスキー形式の有用な参考文献が多数含まれています。(参考文献の参照セクション18.2.6は、他のセクションに有用論文があるが。)Gruneカバーがで文法を簡単に貼り付ける手法の解析の第二版の§15.3.2:実践ガイド(および初版でさらに簡単に、オンラインで入手可能)トップダウン(およびその他の)解析手法を簡単に適用できるという事実に言及しています。

anbncn

Algol 68レポートの編集者でもあるKosterは、接辞文法に関する彼のアイデアに基づいて、コンパイラ記述言語(CDL)の最初の開発者でした。このツールキットとその後の派生物は、長年にわたって生産に使用されていました。Google検索で見つけた永続性を保証できないこのページには、CDL3のマニュアルおよびダウンロードサイトへのリンクがあります。


CDL言語は属性文法に似ていると感じています。属性の値は、外部で定義された関数によって計算できます。Extended Affix Grammarsのように、接辞(属性)の値間の関係が形式内で定義される場合のために、接辞文法の名前を予約します。
reinierpost

@reinierpost:もちろん、あなたはあなた自身の用語を使う資格があります。特権は擬人化された卵に限定されません。しかし、CDLマニュアル自体は、「CDL3は接辞文法に基づいた実装言語である」と主張しており、これを考慮に入れる必要があると思います。(ftp.cs.kun.nl/pub/cdl3/cdl3-manual-1.2.7.pdfで利用可能なマニュアル)。それが私の答えで主張したことです。CDLは接辞文法に関するKosterの研究に基づいているということです。Gruneが指摘しているように、接辞と属性の文法の違いはわずかです。彼の区別は、接辞が構文の妥当性を決定するために使用されるかどうかです。
リチ

(引用は、マニュアルの最初のページからです。)
rici

私は知っている...そしてあなたは正しい。私のコメントはあなたと矛盾するものではありませんでした。
reinierpost

6

CFGのポンピング補題を使用します。

文法を取る

S -> A("")
A(p) -> p 
      | p '\n' A(p"*") '\n' p 

これは星形の三角形について説明しています。

*
**
***
**
*

あなたはvwバツy{あなたはvnwバツny|n>0}vバツ

これは、星の三角形が文脈自由言語ではないことを意味します。

または、より簡単な例:

S-> B("")
B(p)-> p 'a' p 'a' p
     | B(p 'b')

{bnabnabn|n0}


3

この定式化が(Gruneの構文解析テクニックのようなものでさえ)提示されるのを見たことがありません。正確に「パラメーターは基本的にパーサーでなければなりません」無制限のフェーズ構造文法(つまり、コンテキスト依存よりも強力な、すべての停止プログラムを提供するVW文法を書くことができます)。



Kosterと彼のグループは、私が知っている限り、2種類の接辞文法を研究しました。1)Van Wijngaarden文法の制限された形式。2)CDL言語、明示的な接尾辞の値の操作はないが、ターゲット言語(アセンブラーなど)でルールを定義するオプションを備えた実用的なコンパイラ記述言語。チューリングを完全にします。
-reinierpost
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.