如何在C ++中为Backus Naur Form创建规则?-

时间:2018-07-21 00:45:29

标签: c++ algorithm bnf

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

谢谢。

1 个答案:

答案 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";
}

Live on Wandbox