Алгоритм Как создать правило для формы Backus Naur в 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

Благодарю.

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

Жить на Wandbox

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector