タグ付けされた質問 「formal-grammars」

形式文法、形式言語の生成的記述に関する質問。

1
現代の正規表現の表現力
私は最近、主に単語のグループを特別なプロパティと照合する正規表現の課題を提案するWebサイトについて友人と話し合いました。彼は||||||||、数|が素数であるような文字列に一致する正規表現を探していました。そのような言語は、通常であれば、補題をポンプの翻訳が素数のためにあるという事実与えますので、私はすぐにそれが今まで動作しません彼に言われた十分な大きさ、それが存在するのk ≤ pがあるようP + N kは、すべての主要ですN ≥ - 1、よく、これは全くケースしにくい(素数の配分、そのような未知の自明とプロパティを破砕、...)pppk≤pk≤pk \leq pp+nkp+nkp + nkn≥−1n≥−1n \geq -1 しかし、誰かが解決策に付属している:一致しない(||+?)\1+ キャプチャグループに一致するように、この表現しようとする(つまりすることができ||、|||、||||などの上の出現箇所)のn ≥ 2回。一致する場合、文字列で表される数はkで割り切れるので、素数ではありません。それ以外の場合です。k≥2k≥2k \geq 2|n≥2n≥2n \geq 2kkk そして、グループ化と後方参照により、正規表現が理論的な意味で...正規表現よりも実際にはるかに表現力豊かになることが明らかになったので、私は愚かに感じました。今では、実際の正規表現を実行するときに私が知らなかったルックアラウンドやその他の演算子も追加されました。 ウィキペディアによると、文脈自由文法によって生成された言語よりもさらに表現力があります。だからここに私の質問があります: 現代の正規表現エンジンを使用して、(文脈自由文法から生成された)代数言語を表現できますか より一般的な説明、または現代の正規表現で説明できる言語の種類の複雑さの少なくとも上限はありますか? より実用的には、その背後に深刻な理論がありますか、それとも有限オートマトンに基づく実際の正規表現の最初のブロックに実装可能と思われるたびに新しい機能を追加するだけですか? 「モダンな正規表現」は質問が具体的ではないことを知っていますが、少なくとも後方参照を使用することを意味します。もちろん、この「現代の正規表現」言語に対する特定の制限を想定している部分的な回答者がいる場合は、遠慮なく投稿してください。

2
ループを使用して左再帰を処理する再帰降下パーサーの正しい名前は?
この文法は再帰的に残されています: Expression ::= AdditionExpression AdditionExpression ::= MultiplicationExpression | AdditionExpression '+' MultiplicationExpression | AdditionExpression '-' MultiplicationExpression MultiplicationExpression ::= Term | MultiplicationExpression '*' Term | MultiplicationExpression '/' Term Term ::= Number | '(' AdditionExpression ')' Number ::= [+-]?[0-9]+(\.[0-9]+)? したがって、理論的には、再帰的降下は機能しません。ただし、各左再帰ルールが特定の優先レベルに対応し、単一のトークンの先読みで正しい生成を選択するのに十分であるという文法のプロパティを利用することで、左再帰ルールをwhileループで個別に解析できます。 たとえば、AdditionExpression非終端を解析するには、次の疑似コードで十分です。 function parse_addition_expression() { num = parse_multiplication_expression() while (has_token()) { get_token() if (current_token …

1
正式な言語を使用して数学表記を研究できますか?
質問:最適な表記法の研究にそれをどのように適用するかを論じる正式言語またはプログラミング言語理論の紹介テキストはありますか? 特に、スタック言語、解析ツリー、インデックスとは何か、そして特定のタイプの表記法が指数関数的な冗長性につながる時期を予測する方法に興味があります。 数学の専攻として私が学んだ唯一のコンピュータサイエンスは、アルゴリズムとグラフ理論、および複雑さの理論とブール関数の非常に控えめな中級者でした。したがって、これを論じている唯一の本が入門書ではない場合、指数表記の爆発を論じているそのような本と、私の質問に直接取り組む本を準備する入門書をリストした回答の両方に感謝します。 コンテキスト:この質問は、主にPhysics.SEへの回答に触発されており、次のように述べています。 括弧はスタック言語(Chomskyの分類では文脈自由文法)によって解析されるので、括弧はスタックを使用して解析できないため、テンソルインデックスの縮約を再現する括弧表記がないことを(厳密に)証明するのは非常に簡単です。グラフ。括弧は構文解析ツリーを生成し、グラフ内には常に指数関数的に多くの最大ツリーがあるため、表記には指数関数的な冗長性があります。 残りの回答では、「指数表記の爆発」の他の例について、たとえば計算生物学のペトリネットを使用して説明します。 たとえば、ここで言及されているように、関数と引数に適用される関数が明確に区別されていない場合、数学表記が解析しにくい他の例もあります。この関数は、引数になり、引数は、たとえば、関数となる場合には特に混乱になることができ、ここで。

2
BNFが言語を記述するための不十分な手法と見なされるのはなぜですか?
私は先日、C。Stracheyによる論文「プログラミング言語の基本概念」を読んでいました。その中で、私には非常に奇妙なものを読んでいました。直接引用する(奇妙な部分を強調表示した): 今日存在するような、特定のクラスの文法(BNFまたはコンテキストフリーとして知られている)を記述する一般に知られている方法がある状況に直面すると、これらの数学者の最初の本能はBNFの限界を調査することです —面倒で人工的な構造を犠牲にしても、BNFで表現できますか?これはいくつかの数学的な関心の問題かもしれませんが(意味が何であれ)、BNFよりも構文を記述するより良い方法を発見することが重要であるプログラミング言語との関連性はほとんどありません(これはすでにALGOLには不便で不十分です)。それは、私たちがすでに不十分な技術であるとわかっていることの可能な限界を調べることです。 著者がBNFを言語を記述するための不十分な手法であると考える特定の理由はありますか?単一のBNF文法では構文しか記述できず、セマンティクスは記述できないためでしょうか(ただし、属性文法に変換することで、操作セマンティクスを記述するように拡張できます)。

1
途中が1の奇数長の単語に対してDFAを構築することは可能ですか?
L:={w∈{0,1}∗|L:={w∈{0,1}∗|L := \{w \in \{0,1\}^* | の長さは奇数です 1はの中央にありますwww∧∧ \wedge w}w}w\} したがって、アルファベットはです。私の問題は、1と前後の文字の等価性を追跡できないことです。長さが6未満の限定DFA:{0,1}∗{0,1}∗\{0,1\}^*111 どのようにして長さの単語を受け入れるように拡張できますか?出来ますか? 私はそれにサイクルを入れてみましたが、すでに述べたように、後の文字数が前の文字数と同じになるように追跡することはできません。つまり、常に真ん中にある1。111


1
PEGをBNFに変換
解析式文法(PEG)は明確であり、表面的にはBNFに類似した構文を持っていますが、3つの重要な違いがあります。 順序付き選択演算子e1 / e2 / e3。 と述語&。 not演算子!。 少し質問があります: PEGによって認識される言語はすべて文脈自由ですか? (1)の答えが「いいえ」の場合、明確な文法のみを生成することが保証された表現力のある文法形式はありますか?特に、ドロップ&し!てコンテキストフリーの文法のみを生成するでしょうか? すべてのPEGがコンテキストフリーである場合、アルゴリズムを介して同等の BNF に変換できますか? コンテキストは、Chomsky–Schützenberger列挙定理を使用して、PEGライブラリの生成関数を計算したいということです。これには、BNFに類似した標準形式での文法の仕様が必要と思われます。

1
確定的な文法では説明できない実際のコンピュータ言語はどれですか?
非決定的である実際のコンピューター言語の例はありますか? コンピュータ言語ごとに、プログラミング言語、マークアップ言語、クエリ言語、モデリング言語、変換言語などを含めます。 非確定的とは、確定的文法では解析できないことを意味します。

1
これらは、CF以外の補完を持つCF言語の証明に対する有効な反例ですか?
誰かが、文脈自由でない言語の例に、文脈自由でない補完物を求めました。 最初の答えは言う: 言語 L1={ww∣w∈{a,b}∗}L1={ww∣w∈{a,b}∗}L_1= \{ww \mid w \in \{a,b\}^*\}は文脈自由ではありません(ポンピングレンマを使用して表示できるため、ここを参照してください)。その補集合はコンテキストフリーです(ここに示すように)。L2={a,b}∗∖L1L2={a,b}∗∖L1L_2 = \{a,b\}^* \setminus L_1 たぶん実際にはこれは真実かもしれませんが、上記の情報を考えると、これがそのような言語の有効な例であると私は確信していません。私は以前にがCFではないことを証明したので、それを受け入れることに問題はありません。ただし、CFGと与えられた証明は間違っています。私は本当に単純な反例を示すことができます:文字列。明らかにの形式ではないのでです。ただし、は、説明されているCFGを使用して構築することはできません。LLLL2L2L_2s=aaabaas=aaabaas=aaabaas∈L2s∈L2s \in L_2wwwwwwsssL2L2L_2 証明:文字列長さが偶数であるため、文字列はまたはの形式ではありません。したがって、それはまたはの形式である必要がありますが、ストリングの両方の半分の中央に同じ文字()があるため、これは不可能です。したがって、は矛盾します。sssAAABBBABABABBABABAaaas∉L2s∉L2s \notin L_2 2番目の答えは言う: ウィキペディアで見られる例:put、。PDAを定義することで、とがコンテキストフリーであることが簡単にわかります。あなたはそれらが決定論的文脈自由言語であることに気づくことができます、それは補完の下で閉じられたクラスです。したがって、は、文脈自由ではない補語持つ文脈自由言語です。A={anbncm}A={anbncm}A=\{a^n b^n c^m\}B={ambncn}B={ambncn}B=\{a^m b^n c^n\}A¯¯¯¯A¯\overline{A}B¯¯¯¯B¯\overline{B}A¯¯¯¯∪B¯¯¯¯A¯∪B¯\overline{A} \cup \overline{B}A∩B={anbncn}A∩B={anbncn}A \cap B=\{a^n b^n c^n\} これは反証するのがさらに簡単です。確かに、決定論的な文脈自由言語は補完の下で閉じられていますが、それらは結合の下で閉じられていません。したがって、言語は必ずしも文脈自由ではありません。A¯¯¯¯∪B¯¯¯¯A¯∪B¯\overline{A} \cup \overline{B} 私は現在、まだTheory of Computingを受講しているので、何か問題が発生したか、明らかな真実を見落とした可能性があります。誰かが私の主張を否定できますか?そうでない場合は、CF以外の補完機能を備えたCF言語の有効な例を提供できますか?

5
形式システムと形式言語の関係
コンピュータサイエンスのコースでは、形式言語、文法、オートマトン、チューリングマシンの階層を研究するのが一般的です。これらのオブジェクトと正式なシステムとの関係はどうなっているのでしょうか。 例えば、ラムダ計算は正式なシステムであると言われています。その文法も正式なシステムと見なされますか?

3
wwwの文脈依存文法を生成する方法
私はこれから出題される試験の問題を解決しようとしています。たとえば、この種の質問にどのように進むかなど、状況依存言語の文法を生成する方法がわかりません。 (長さを増やすだけでなく)状況依存の文法を {www:w∈{a,b}⋆}{www:w∈{a,b}⋆}\{www : w ∈ \{a, b\}^⋆\}。 この種の質問への対処方法に関するアイデアやアプローチは高く評価されています。

2
一緒に、文脈自由言語のあらゆる生成を呼び出す最小長の文字列のセットを生成する
問題(tl; dr) 文脈自由文法を考えると、、取る文字列のセットを見つける、それが少なくとも一度持つすべての生産を通じてを。GGGGGG どのように、そしてどのくらい速くそれを行うことができますか? バックグラウンド 私はパーサーがYacc + Antlrのようなツールで実装されているコンパイラーに取り組んでいます。ほとんどのパーサーコードを作成しましたが、文法のすべてのプロダクションを少なくとも1回呼び出すオブジェクト言語のコードを生成して、パーサーにフィードして問題がないことを確認したいと思います。 。 良いテストのために、私が本当に欲しいのは、特定のプロダクションが「テスト中」である1つの短いテストファイルです。したがって、各プロダクションルールについて、パーサーを取得する最小限の文字列を生成します。テスト中のプロダクションから一連の端末への状態の開始 可能な解決策 グラフ理論を使用したエレガントなソリューションがあると思いますが、それが何かはよくわかりません。ダイクストラのアルゴリズムを使用して適切な構造を通る最短パスを検索したいのですが、文字列はパスではなくツリー構造の文脈自由文法によって解析されると思います。そのため、どうすればよいかわかりません。 。 それをネットワークフローの問題として提起するための巧妙な方法があるのではないかと思います。次のようなもの:すべてのシンボル(終端と非終端)の頂点とすべての生成の頂点を持つグラフを取り上げます。非ターミナルにプロダクションがある場合、非ターミナルからプロダクションに有向エッジを追加します。プロダクションがシンボルを生成する場合、プロダクションからシンボルに有向エッジを追加します。容量ソースを追加し、開始シンボルに対応する頂点にアタッチします。無限の容量のシンクを追加して、各端子に取り付けます。ccc 非終端が容量アーク内にある場合、非終端から容量各生成物に弧を追加します。プロダクションに容量インアークがあり、アウトアークからターミナルがある場合、プロダクションから各非ターミナルにキャパシティアークを追加します。kkkkkkkkknnnknkn\frac k n 次に、ネットワーク上でいくつかの最大フローアルゴリズムを実行し、プロダクションを開始シンボルから端末まで「トリクルダウン」させます。最終的には、フローがソースから出てくるはずであり、ヒットしたすべての端末をゼロ以外のフローで結果文字列として返すことができます。次に、実行ごとに時間の複雑さのようなものになります。ここで、は文法内の終端と非終端の数の合計です-悪くありません。cccO(n3)O(n3)O(n^3)nnn ただし、このグラフがどのように見えるかはまだわかりません。無限である必要があると思います。無限のフローネットワークの最大フローを見つけることができるかどうかはわかりません。それを過ぎると、プロダクションを「削除」する方法がわからないので、テストを実行するたびに新しいプロダクションを取得することが保証されます。 私はグーグルで検索して何も見つかりませんでした。この問題に対する素晴らしい解決策はありますか?

5
プログラミング言語とチューリングマシンの正確な関係は何ですか?
yacc、bison、flex、lexについてよく知らないので、間違っている場合は修正してください。ただし、プログラミング言語もTuringマシンであり、Turingマシンはタプル where、、、 as input、は遷移関数として、 =左へのステップ数、 =右へのステップ数、 = "スタンバイ"、は初期状態、(Q,Γ,b,Σ,δ,q0,F)(Q,Γ,b,Σ,δ,q0,F)(Q, \Gamma, b, \Sigma, \delta, q_0, F)QQQΓΓ\Gammab∈Γb∈Γb \in \GammaΣ⊆Γ∖{b}Σ⊆Γ∖{b}\Sigma \subseteq \Gamma \smallsetminus \{ b \}δ:Q×Γ→Q×Γ×{L,R,N}δ:Q×Γ→Q×Γ×{L,R,N}\delta: Q \times \Gamma \rightarrow Q \times \Gamma \times \{ L, R, N \}LLLRRRNNNq0∈Qq0∈Qq_0 \in QF⊆QF⊆QF \subseteq Q 終了状態のセットです。 プログラミング言語の実装は、チューリングマシンの実装とどの程度似ていますか?上記のようなチューリングマシンが定義されたことでプログラミング言語が実装されたときに何が行われると言えるのでしょうか?もしそうなら、プログラミング言語が定義されているときに、チューリングマシンの定義のように見えるモデルを使用できないのはなぜですか?代わりに、BNFのような何かが標準のようです。

2
{a ^ ib ^ jの文脈自由文法| i、j≥0; i≠2j}
誰かがこれを助けることができます: L={aibj∣i,j≥0 and i≠2j}L={aibj∣i,j≥0 and i≠2j}L=\{a^ib^j \mid i,j \ge 0 \text{ and } i \ne 2j\} この言語の文法を書こうとしているのですか?これを行う方法がわかりません。私はこれを試しました: S→aaAb∣aAA→aA∣aS→aaAb∣aAA→aA∣aS \rightarrow aaAb \mid aA \\ A \rightarrow aA \mid a


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