2010-12-11 20 views
2

私の決勝戦を勉強しています&私は文脈自由文法の記事をウィキペディアから読んでいて、次の例を見ました。文脈自由文法 - 計算理論

S → SS- (1st production rule) 

S → (S) - (2nd production rule) 

S →() - (3rd production rule) 

私は左右の派生を十分に認識しています。私はこの問題を解決しようとしたとき、私は開始記号で始まる

S-> SS -> (S)S->()S->()(S) ->()() 

が、私は答えを見たとき、それは私が私の答えと間違って何が起こるのかわからないこの

S → SS → SSS → (S)SS → ((S))SS → ((SS))S(S) 
→ ((()S))S(S) → ((()()))S(S) → ((()()))()(S) 
→ ((()()))()(()) 

ようなものでしたか?最初の生産ルールを2回使用する必要がありますか?誰でも私にこれを手伝ってもらえますか?

+0

上記の問題は、Sは非終端記号で、(、)は終端記号です。私は再帰を使用しているが、どのように動作するのか知っていますか? – cool

答えて

1

私はこの問題を解決しようとしたとき、私は開始記号で始まる

何が問題?ウィキペディアの記事は問題を提起しません。よく似た括弧の言語を記述する文法を示し、その言語の単語の例とその派生方法を示します。完全に有効な派生だ

S-> SS -> (S)S->()S->()(S) ->()() 

。私は答えを見たときに

はしかし、それは(何の質問がありませんでした)答えではないのです。この

のようでした。それは単なる例です。

私の答えが間違っているかどうかわかりません。

派生に問題はありません。 ()()((()()))()(())の両方が、この言語で有効な単語です。

第1の制作ルールを2回使用する必要がありますか?

生産ルールは、必要に応じて頻繁に適用することができます(置き換えたい非ターミナルがこの用語に含まれていることを前提とします)。それはすべてあなたが派生したい単語に依存します。

+0

最後にターミナルシンボルを実現したい回数だけルールを適用できますか? – cool

+0

@cool:はい、そうです。 – sepp2k

+1

@cool:一般的には(試験やパーサーを書くとき)、ルールを使って特定のシーケンス(例えば '(())')が有効であることを示します。 – SimonJ

2

あなたのアプローチには何も「間違っていません」 - ウィキペディアの記事に異なるシンボルシーケンスを導いただけです。

重要なポイントは、それがマッチングの任意のシーケンスを導き出すことが可能であるということです、(())()(様配列文法を使用して括弧を入れ子にではなく。

+0

それを得ました。ありがとう。 – cool

1

この記事では、単に文法を使って表現できる1つの文字列を提供しています。可能な別の文字列を指定しています。派生を使用して、それらの文字列が文法に従って有効であることを証明することができます(つまり、逆の方向に進む)。

編集:パンチに殴られた:P

関連する問題