[英]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.