Я пытаюсь создать простой синтаксический анализатор, который принимает один из двух возможных символов, используя boost::spirit::x3
. Проблема в том, что x3::char_('#') | x3::char_('.')
, кажется, имеет атрибут типа boost::variant<char, ?>
. Это означает, что я должен использовать boost::get<char>
на _attr
, тогда как он должен быть напрямую конвертирован в char
.Атрибут boost spirit x3 (A | A) - это вариант <A, ?> вместо A
http://ciere.com/cppnow15/x3_docs/spirit/quick_reference/compound_attribute_rules.html, он говорит A | A -> A
Если закомментирована версия mapChars
используется, то это конвертируемые в char
, но не в |
.
Я на boost версии 1.63.0 и на Linux. Код не скомпилирован как на g ++, так и на clang ++ с -std=c++14
.
Что я делаю неправильно?
#include <iostream>
#include <string>
#include <boost/spirit/home/x3.hpp>
int main() {
std::string s("#");
namespace x3 = boost::spirit::x3;
auto f = [](auto & ctx) {
auto & attr = x3::_attr(ctx);
//char c = attr; // doesn't work
char c = boost::get<char>(attr); // does work
};
auto mapChar = x3::char_('#') | x3::char_('.'); // _attr not convertible to char, is a variant
//auto mapChar = x3::char_('#'); // _attr convertible to char, isn't a variant
auto p = mapChar[f];
auto b = s.begin();
bool success = x3::parse(b, s.end(), p);
std::cout << "Success: " << success << ' ' << (b == s.end()) << '\n';
}
Я думаю, что 'x3 :: полукокса _ ("#").' Должен делать то, что вы хотите. Конечно, это не решает проблему варианта «A | A->'. – llonesmiz
Для этого примера это очень эквивалентно – sehe