gpt4 book ai didi

c++ - 我如何在 Boost Spirit 中实现 const?

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

我现在对 Boost Spirit 很感兴趣,并尝试构建一些东西。我们可以使用 Spirit 在 C++ 中实现类似 const 的东西吗?例如,用户将定义一个项目;

constant var PROG_LANG="Java"; 

“constant var”看起来很奇怪,我接受,但你明白了。我在互联网上进行了搜索,但找不到任何相关信息。

最佳答案

BigBoss 说的:)

只有我会在没有语义 Action 的情况下做 - 让它变得不那么......冗长(另见 Boost Spirit: "Semantic actions are evil"? ):

vdef = 
("constant" >> attr(true) | attr(false)) >>
"var" >> identifier >> '=' >> identifier_value >> ';' ;

就是这样。这使用 qi::attr 来说明默认值(缺少 constant 关键字)。

这是一个带有输出的完整演示:

http://liveworkspace.org/code/c9e4bef100d2249eb4d4b88205f85c4b

输出:

parse success: 'var myvariable = "has some value";'
data: false;myvariable;has some value;
parse success: 'constant var myvariable = "has some value";'
data: true;myvariable;has some value;

代码:

#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>

namespace qi = boost::spirit::qi;
namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;

struct var_definition {
bool is_constant;
std::string name;
std::string value;

var_definition() : is_constant( false ) {}
};

BOOST_FUSION_ADAPT_STRUCT(var_definition, (bool, is_constant)(std::string, name)(std::string, value))


void doParse(const std::string& input)
{
typedef std::string::const_iterator It;

qi::rule<It, std::string()> identifier, identifier_value;
qi::rule<It, var_definition(), qi::space_type> vdef;

{
using namespace qi;

identifier_value = '"' >> lexeme [ +~char_('"') ] > '"';
identifier = lexeme [ +graph ];
vdef =
("constant" >> attr(true) | attr(false)) >>
"var" >> identifier >> '=' >> identifier_value >> ';' ;
}

var_definition data;

It f(std::begin(input)), l(std::end(input));
bool ok = qi::phrase_parse(f,l,vdef,qi::space,data);
if (ok)
{
std::cout << "parse success: '" << input << "'\n";
std::cout << "data: " << karma::format_delimited(karma::auto_, ';', data) << "\n";
}
}

int main()
{
doParse("var myvariable = \"has some value\";");
doParse("constant var myvariable = \"has some value\";");
}

关于c++ - 我如何在 Boost Spirit 中实现 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114052/

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