我是BNF的新手,我真的不知道/不了解如何制定规则以及如何在c ++上进行检查。我看到了一些示例,但没有解释它如何工作以及规则如何检查输入;
例如我们的老师在我们的课程中举了这个例子
<palindrome>::=<empty>|a|b|a<palindrome>a|b<palindrome>b
sample input: abba
how it checks:
<empty>
a<palindrome>a
ab<palindrome>a
abba
谢谢。
答案 0 :(得分:0)
您可以尝试Boost.Spirit X3。为此,您必须重新编写规则,因为Boost.Spirit一旦找到匹配的内容就立即停止解析,即在字符串abba
中将匹配a
并停止。
#include <iostream>
#include <string>
#include <boost/spirit/home/x3.hpp>
namespace x3 = boost::spirit::x3;
auto const a = x3::char_('a');
auto const b = x3::char_('b');
auto const aa = x3::lit("aa");
auto const bb = x3::lit("bb");
x3::rule<class palindrome> const palindrome = "palindrome";
auto const palindrome_def
= a >> palindrome >> a
| b >> palindrome >> b
| aa
| bb
| a
| b;
BOOST_SPIRIT_DEFINE(palindrome);
int main() {
std::string input = "abba";
auto first = input.begin();
auto last = input.end();
bool r = parse(first, last, palindrome);
if (!r || first != last) {
std::cerr << "Parsing failed at " << std::string{first,last} << '\n';
return 1;
}
std::cout << "Success :)\n";
}