これは文法プログラムの再定式化ですか?Vagによる以前の質問と、コメント作成者からの多くの提案。
文法はどのように計算のモデルを指定していると見ることができますか?たとえば、次のような単純な文脈自由文法を使用する場合
G ::= '1' -> '0' '+' '1'
'1' -> '1' '+' '0'
'2' -> '2' '+' '0'
'2' -> '1' '+' '1'
'2' -> '0' '+' '2'
'3' -> '3' '+' '0'
'3' -> '2' '+' '1'
'3' -> '1' '+' '2'
'3' -> '1' '+' '2'
パーサが区別されないと仮定すると、端末と非終端私がここに実証されてきたように、シンボル、3までの番号については、単純な算術演算を行うことが可能です。
たとえば、文字列を取ります
"2 + 0 + 1"
この文字列でLR(1)パーサーを実行すると、計算の結果がツリーのルートに格納される次の具体的な構文ツリーが得られます。
'3'
/ | \
/ | \
'2' '+' '1'
/ | \
/ | \
'2' '+' '0'
したがって、文法をプログラムに、パーサージェネレーターをコンパイラーにすると、文法仕様言語をプログラミング言語と見なすことができますか?
さらに、セルオートマトンまたはラムダ計算でチューリング完全プログラムを構築する方法と同様の文法を指定して、チューリング完全プログラムを構築できますか?
つまり、言語を認識するという意味では、通常の言語は有限状態オートマトンに対応し、コンテキストフリー言語はプッシュダウンオートマトンに対応し、コンテキスト依存言語は線形有界オートマトンに対応することが知られています。しかし、文法を計算デバイス(つまり、上記の例の意味でのプログラム)として見ると、チョムスキー階層の各クラスの文法の計算強度をどのように分類するのでしょうか?
また、次のような文法のあまり知られていないサブクラスについてはどうですか
- 決定論的コンテキストフリー文法(LR(k) / LL(k) / SLR / LALRなど)
- 入れ子になった単語の文法
- ツリーに隣接する文法
- インデックス付き文法
編集:ちなみに、これは私自身の質問のちょっとした選択ですが、例の文法に開始記号を付けず、端末と非端末を区別する必要性に手を振ったことは言及しませんでした。技術的または伝統的に、私はおそらくこのようなより複雑な形式で文法を書く必要があると思います(Sは開始記号で、$はストリームの終端を表します)。
G ::= S -> R0 '$'
S -> R1 '$'
S -> R2 '$'
R0 -> '0'
R0 -> R0 '+' '0'
R1 -> '1'
R1 -> R0 '+' '1'
R1 -> '1' '+' R0
R1 -> R0 '+' '1' '+' R0
R2 -> '2'
R2 -> R0 '+' '2'
R2 -> '2' '+' R0
R2 -> R0 '+' '2' '+' R0
R2 -> R1 '+' '1'
R2 -> R1 '+' '1' '+' R0
...実際に何かが変わるわけではありませんが、言及する必要があると思いました。
編集: gascheの答えを読んだときに気になった他のことは、私の例のツリーの各ブランチはサブ計算を表しているということです。各プロダクションルールを、LHSが結果を表し、RHSがその引数を表す関数として見ると、文法の構造によって関数の構成方法が決まります。
つまり、パーサーのコンテキストと先読みメカニズムを組み合わせることで、適用する関数(パラメトリック多相性のような 'kinda')だけでなく、それらをどのように組み合わせて新しい関数を作成するかを決定するのに役立ちます。
少なくとも、曖昧さのないCFGについては、このように見ることができると思います。他の文法については、今のところ精神体操は私には少し多すぎます。