我有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
我有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
正则表达式对于任务来说不够强大,但在例如EBFN中用于增强语法的表达能力。你可以考虑一个自顶向下的解析器(通过递归调用来解析你的输入)。这很容易在允许相互递归调用的所有语言中实现。它需要一个有一些限制的语法(如果你有兴趣,请参阅维基百科)。乍一看,你的语法应该是LL(1),即需要1令牌前瞻。
我想通过使用正则表达式 – couatl
您可以将每个规则分割为->|\|
以获取所需的列表。
解释来解决问题,pleaseк – couatl
我不精通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
使用“ - >”和“|”作为拆分中的分隔符? – couatl
您使用哪种语言/工具? – Qtax
C++和boost.regex – couatl
我会用“[A-ZA-Z] +”,但是这不是我想要的 – couatl