gpt4 book ai didi

c++ - 语法意外失败 boost::spirit 语法定义

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:26 24 4
gpt4 key购买 nike

我是 boost:spirit 的新手,我猜这个问题对于高级用户来说是微不足道的。以下语法不符合我的预期:

    #pragma once

#include <string>
#include <vector>

#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/qi_alternative.hpp>


namespace overmath
{
using namespace std;
namespace qi = boost::spirit::qi;
using namespace boost::spirit::unicode;

struct identifier
{
wstring name;
};

struct function
{
identifier name;
};

struct program
{
vector<function> functions;
};
}

BOOST_FUSION_ADAPT_STRUCT(
overmath::identifier,
(std::wstring, name)
)

BOOST_FUSION_ADAPT_STRUCT(
overmath::function,
(overmath::identifier, name)
)

BOOST_FUSION_ADAPT_STRUCT(
overmath::program,
(std::vector<overmath::function>, functions)
)


namespace overmath
{
using namespace boost::spirit::unicode;
namespace qi = boost::spirit::qi;
using boost::spirit::lit;

template<typename Iterator> struct function_parser : qi::grammar<Iterator, program(), space_type>
{
function_parser() : function_parser::base_type(program)
{
identifier %=
qi::eps
>> +alnum;

function %=
lit("def ")
>> identifier
>> '('
>> ')'
>> lit(" enddef");

program %=
qi::eps
>> +function;
}

qi::rule<Iterator, identifier(), space_type> identifier;
qi::rule<Iterator, function(), space_type> function;
qi::rule<Iterator, program(), space_type> program;
};

template<typename Iterator> wstring parse(Iterator first, Iterator last)
{
using boost::spirit::qi::phrase_parse;

program f;
function_parser<Iterator> fp;

auto b = phrase_parse(first, last, fp, space, f);
if(b)
{
return wstring(L"OK");
}
return wstring(L"FAIL");
}

}

当我用字符串“def abc() enddef”测试它时,解析失败。我不知道为什么。我做错了什么?非常感谢。

最佳答案

你的 skipper 吃掉了空格,所以 "def ""enddef" 永远不会匹配。

另见 Boost spirit skipper issues

Live On Coliru

#include <string>
#include <vector>

#define BOOST_SPIRIT_UNICODE
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/qi_alternative.hpp>

namespace overmath {
using namespace std;
namespace qi = boost::spirit::qi;
using namespace boost::spirit::unicode;

struct identifier { wstring name; } ;
struct function { identifier name; } ;
struct program { vector<function> functions; } ;
}

BOOST_FUSION_ADAPT_STRUCT(overmath::identifier, (std::wstring, name))
BOOST_FUSION_ADAPT_STRUCT(overmath::function, (overmath::identifier, name))
BOOST_FUSION_ADAPT_STRUCT(overmath::program, (std::vector<overmath::function>, functions))

namespace overmath {
using namespace boost::spirit::unicode;
namespace qi = boost::spirit::qi;
using boost::spirit::lit;

template <typename Iterator> struct function_parser : qi::grammar<Iterator, program(), space_type> {
function_parser() : function_parser::base_type(program) {

identifier = qi::eps >> +alnum;
function = "def" >> identifier >> '(' >> ')' >> "enddef";
program = qi::eps >> +function;
}

qi::rule<Iterator, identifier()> identifier;
qi::rule<Iterator, function(), space_type> function;
qi::rule<Iterator, program(), space_type> program;
};

template <typename Iterator> wstring parse(Iterator first, Iterator last) {
using boost::spirit::qi::phrase_parse;

program f;
function_parser<Iterator> fp;

auto b = phrase_parse(first, last, fp, space, f);
if (b) {
return wstring(L"OK");
}
return wstring(L"FAIL");
}
}

int main() {
std::wstring const s = L"def abc() enddef";
std::wcout << overmath::parse(s.begin(), s.end());
}

关于c++ - 语法意外失败 boost::spirit 语法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com