タグ付けされた質問 「context-free-grammar」

20
C ++は状況依存ですか、状況依存ですか?
C ++は状況依存言語であるという主張をよく耳にします。次の例を見てください。 a b(c); これは変数定義ですか、関数宣言ですか?それは記号の意味に依存しcます。場合cである変数は、その後、a b(c);名前の変数を定義bタイプのをa。で直接初期化されcます。しかし、cがタイプの場合、を取り、を返すa b(c);という名前の関数を宣言します。bca 文脈自由言語の定義を調べると、基本的に、すべての文法規則の左側には、1つの非終端記号だけが含まれている必要があることがわかります。一方、状況依存の文法では、左側に終端記号と非終端記号の任意の文字列を使用できます。 「C ++プログラミング言語」の付録Aを閲覧したところ、左側に単一の非終端記号以外に何もない単一の文法規則が見つかりませんでした。これは、C ++がコンテキストフリーであることを意味します。(もちろん、すべての文脈自由言語は、文脈自由言語が文脈依存言語のサブセットを形成するという意味で文脈依存でもありますが、それが目的ではありません。) では、C ++はコンテキストフリーですか、それともコンテキスト依存ですか?

2
文脈自由文法とは何ですか?
誰かが文脈自由文法とは何かを私に説明できますか?Wikipediaのエントリ、次に正式な文法のWikipediaのエントリを調べた後、私は完全に戸惑いました。誰かがこれらのことを説明できるほど親切でしょうか? 構文解析と、正規表現エンジンの制限についても調査したいので、これは不思議に思っています。 これらの用語が直接プログラミングに関連しているか、一般的に言語学に関連しているかはわかりません。その場合は、申し訳ありませんが、もしそうであれば移動できますか?

8
通常のVS文脈自由文法
私は自分のコンピューティング言語テストのために勉強しています。頭を回すのに問題があるという考えがあります。 通常の文法はより単純で曖昧さを含むことはできないが、プログラミング言語に必要な多くのタスクを実行することはできないことを理解しました。また、文脈自由文法は曖昧さを許容しますが、プログラミング言語に必要ないくつかのもの(パリンドロームなど)を許容することも理解しました。 私が問題を抱えているのは、通常の文法の非端末が端末または非端末の後に端末が続くか、コンテキストフリーの非端末が端末と非端末の任意の組み合わせにマッピングできることを知ることで、上記のすべてをどのように導出できるかを理解することです。。 誰かが私がこれをすべてまとめるのを手伝ってくれる?

1
「現代の」正規表現の認識力
実際の現代の正規表現は実際にどのクラスの言語を認識しますか? 後方参照(例(.*)_\1)を持つ無制限の長さのキャプチャグループがある場合は常に、正規表現が非正規言語と一致するようになりました。しかし、これだけでは、次のようなものに一致するのに十分ではありませんS ::= '(' S ')' | ε—親のペアを一致させる文脈自由言語。 再帰的な正規表現(これは私にとっては新しいものですが、PerlとPCREに存在すると確信しています)は、少なくともほとんどのCFLを認識しているように見えます。 誰かがこの分野で何か研究をしたり読んだりしましたか?これらの「現代の」正規表現の制限は何ですか?彼らは、LLまたはLR文法のCFGよりも厳密に多いか厳密に少ないかを認識していますか?または、正規表現では認識できるがCFGでは認識できない言語とその逆の言語の両方が存在しますか? 関連する論文へのリンクをいただければ幸いです。

2
なぜCのBNF文法は、空のinit-declaratorのシーケンスでの宣言を許可するのですか?
CのBNF文法を調べたとき、宣言のプロダクションルールが次のようになっているのは奇妙だと思いました(https://cs.wmich.edu/~gupta/teaching/cs4850/sumII06/The%20syntax%20of%によると) 20C%20in%20Backus-Naur%20form.htm): <declaration> ::= {<declaration-specifier>}+ {<init-declarator>}* ; なぜ*量指定子(0回以上のオカレンス)を使用するのinit-declaratorですか?これにより、int;またはなどのステートメントvoid;は、意味的に無効であっても、構文的に有効になります。プロダクションルールでは+なく、数量詞(1つ以上のオカレンス)を使用しただけではありません*か? 単純なプログラムをコンパイルして、コンパイラーが何を出力するかを確認しましたが、コンパイラーが行うのは警告を出すことだけです。 入力: int main(void) { int; } 出力: test.c: In function ‘main’: test.c:2:5: warning: useless type name in empty declaration int; ^~~
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.