2011-12-02 81 views
0

我有CF文法。它的規則如下:使用正則表達式解析規則CF文法(如何使用模板)

S-> A | AS

A-> AB | A | B

B-> b

我想分析這些規則使用正則表達式。

我的正則表達式:

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

對於:「 A-> AB | A | b」的結果:

0:A-> AB | A | b

1:

2:乙

但我whant此:

0:A-> AB | A | B

1:

2:AB

3 :a

4:b

+1

您使用哪種語言/工具? – Qtax

+0

C++和boost.regex – couatl

+0

我會用「[A-ZA-Z] +」,但是這不是我想要的 – couatl

回答

0

正則表達式對於任務來說不夠強大,但在例如EBFN中用於增強語法的表達能力。你可以考慮一個自頂向下的解析器(通過遞歸調用來解析你的輸入)。這很容易在允許相互遞歸調用的所有語言中實現。它需要一個有一些限制的語法(如果你有興趣,請參閱維基百科)。乍一看,你的語法應該是LL(1),即需要1令牌前瞻。

+0

我想通過使用正則表達式 – couatl

0

您可以將每個規則分割爲->|\|以獲取所需的列表。

+0

解釋來解決問題,pleaseк – 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