2011-12-02 1 views
0

私はCF文法を持っています。解析規則正規表現を使用したCF-文法(テンプレートの使い方)

B-> B

bは、私はこれらのルールを解析したい| |

A-> AB AS |

S-> A:それは次のようにあるルール正規表現を使用します。

私の正規表現:

B \([AZ]) - >(:([A-ZA-Z] +)\ |??)+

の場合: " A-> AB | | B」結果:

0:A-> AB | | B

1:

2:B

私はこのwhant:

0:A-> AB | | B

1:

2:AB

3 :

4:b

+1

どの言語/ツールをお使いですか? – Qtax

+0

C++とboost.regex – couatl

+0

私は "[A-Za-z] +"を使用しますが、それは私が欲しいものではありません。 – couatl

答えて

0

正規表現はタスクには十分強力ではありませんが、文法の表現力を高めるためにEBFNなどで使用されます。入力を解析するためのトップダウンパーサー(再帰呼び出しによって形成された)を考えることができます。相互に再帰的な呼び出しを可能にするすべての言語で実装するのは簡単です。これにはいくつかの制限付きの文法が必要です(興味がある場合は、これに関するWikipediaを参照してください)。一見すると、あなたの文法はLL(1)でなければなりません。すなわち、1トークン先読みが必要です。

+0

正規表現を使用して問題を解決したいですか? – couatl

0

->|\|ですべてのルールを分割して、目的のリストを取得できます。

+0

explain、pleaseKB – couatl

+0

私はC++に堪能ではありません/ boost、しかし私はあなたにPerlの例を示すことができます: 'say join" \ n "、split/- > | \ | /、" A-> AB | a | b ";関連するブーストリンクhttp://www.boost.org/doc/libs/1_31_0/libs/regex/doc/regex_split.htmlおよびhttp://www.boost.org/doc/libs/1_31_0/libs/regex/doc /regex_token_iterator.html – Qtax

+0

" - >"と "|"分割の区切り記号として? – couatl

関連する問題