我有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