web-dev-qa-db-ja.com

「文脈自由文法」を作成するためのヒント

私はCFGの初心者です。
誰かがいくつかの言語を生成するCFGを作成するためのヒントを教えてもらえますか

例えば

L = {am bn | m >= n}

私が得たのは:

So -> a | aSo | aS1 | e
S1 -> b | bS1 | e

bの数がa 'よりも大きくなる可能性があるため、この領域は間違っていると思いますs。

12
user1988365

例でCFGを書く方法mbn

L = {am bn | m> = n}。

言語の説明: am bn aに続くbで構成され、aの数は等しいかそれ以上次に、bの数。

文字列の例:_{^, a, aa, aab, aabb, aaaab, ab......}_

そのため、常に1つのaが存在しますbですが、追加のaが可能です。感染文字列はaのみで構成できます。また、_^_ nullは言語のメンバーであることに注意してください。これは_^_NumberOf(a) = NumberOf(b) = 0

文字列によって形成された言語を受け入れる文法を書く方法m bn

文法では、bシンボルを追加する場合、aシンボルも追加するというルールが必要です。

そして、これは次のようなもので行うことができます:

_   S --> aSb 
_

ただし、追加のasを生成するルールが必要なため、これは不完全です。

_   A --> aA | a
_

2つのプロダクションルールを1つの文法に結合しますCFG。

_   S --> aSb | A
   A --> aA  | a
_

したがって、aおよびaおよびbで構成される任意の文字列を生成できます。で(am bn)パターン。

しかし、上記の文法にはnoを生成する方法があります_^_文字列。

したがって、この文法を次のように変更します。

_   S --> B   | ^
   B --> aBb | A
   A --> aA  | a
_

この文法は{am bn | m> = n}言語。

:_^_ null文字列を生成するために、_S--> B | ^_を追加することにより、文法の最初のステップを追加しました。したがって、_^_またはシンボルの文字列を追加できますaおよびb。 (now Bは、以前の文法のSの役割を果たし、等しい数のaを生成しますb

編集: @Andy Haydenに感謝
同じ言語に対して同等の文法を書くこともできます{am bn | m> = n}:

_   S --> aSb | A
   A --> aA | ^
_

注意:ここで_A --> aA | ^_はゼロまたは任意の数のaを生成できます。また、同じ文字列に対してより小さな解析ツリーが生成されるため、私の文法よりも望ましいはずです。
効率的な解析のために高さが低い方が望ましい

次のtipsは、正式な言語の文法を書くのに役立ちます。

  • 言語について、それが記述するもの(意味/パターン)を明確にする必要があります。
  • いくつかの基本的な問題の解決策を思い出すことができます(新しい文法を書くことができるという考えです)。
  • Right-Linear-Grammmarを記述するためにこの例でREを記述しました のような基本言語のルールを記述できます。ルールは、新しい言語の文法を書くのに役立ちます。
  • 1つの異なるアプローチは、最初にautomataを描画し、次にオートマトンをGrammarに変換することです。任意のクラスの形式言語のオートマトンから文法を書くための事前定義されたテクニックがあります。
  • 他の人のコードを読むことで学習する優秀なプログラマーのように、同様に正式な言語の文法を書くことを学ぶことができます。

また、あなたが書いた文法は間違っています。

48
Grijesh Chauhan

次の言語の文法を作成したい

    L= {an bm | m>=n }

つまり、「b」の数は「a」の数以上でなければなりません。または、「b」ごとに最大で1つの「a」を指定できます。他の方法ではありません。

こちらがこの言語の文法です

      S-> aSb | Sb | b | ab

この文法では、「a」ごとに1つの「b」があります。ただし、「a」を生成せずにbを生成できます。

これらの言語を試すこともできます:

           L1= {an bm | m > n }
           L2= {an bm | m >= 2n }
           L3= {an bm | 2m >= n }
           L4= {an bm | m != n }

各言語の文法を教えています。

l1用

         S-> aSb | Sb | b

l2用

         S-> aSbb | Sb | abb

l3用

         S-> AASb | Sb | aab | ab | b

l4用

        S-> S1 | S2
        S1-> aS1b | S1b | b
        S2-> aS2b | aS2 | a
5
Anand Pandey

最小変数:S-> a S b | S e

2
Chris Chan

より少ない変数で:

S-> a S b | S a b | e

0
Alireza Sanaee