Я новичок в 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";
}
Других решений пока нет …