簡體   English   中英

如何在C ++中為Backus Naur Form創建規則?-

[英]How to create a rule for Backus Naur Form in c++?-

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

謝謝。

您可以嘗試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";
}

在魔盒上直播

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM