2011-12-02 62 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