gpt4 book ai didi

c++ - Boost Spirit(经典): Inline parser, 工作,除了跳过评论

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:18 24 4
gpt4 key购买 nike

<分区>

编辑:正如在 sehe 的回答的评论中提到的,下面的代码工作得很好;这是我对迭代器(此处未显示)的处理有问题。对不起这是我的错。投票关闭离题/不可重现。

EDIT2: 详细说明...如果您正在使用 boost::spirit::istream_iterator 来提供 ifstream 到解析函数(就像我做的那样),不要忘记先在那个 ifstream 上调用 unsetf( std::ios::skipws ) ,或者你的解析会失败...


我有一个如下所示的 DSL(领域特定语言)文件:

# Comment (optional)

codepage = "ISO-8859-2";
...

codepage 规范是文件中的第一个非注释语句,或者文件被认为是默认代码页。

我征用了 Boost Spirit 来完成这项任务。出于技术原因(咳咳 AIX/XLC 咳咳),我不得不继续使用 Spirit Classic,并且在浏览了一些令人头疼的教程之后——它们总是旨在涉及更多设置,比我希望的要复杂得多——我想出了这段代码:

#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_rule.hpp>
#include <boost/spirit/include/classic_utility.hpp>

#include <string>

namespace spirit_classic = boost::spirit::classic;

template< typename Iterator >
static std::string getCodepage( Iterator first, Iterator last )
{
std::string codepage;

spirit_classic::parse(
first,
last,
spirit_classic::as_lower_d[ "codepage" ]
>> spirit_classic::ch_p( '=' )
>> spirit_classic::lexeme_d[ spirit_classic::ch_p( '"' )
>> ( +( spirit_classic::anychar_p - spirit_classic::ch_p( '"' ) ) )[spirit_classic::assign_a( codepage )]
>> spirit_classic::ch_p( '"' ) ]
>> spirit_classic::ch_p( ';' ),
spirit_classic::space_p | spirit_classic::comment_p( '#' )
);

if ( codepage.empty() )
{
codepage = "UTF-8";
}

return codepage;
}

这工作得很好......除了 skipper :

...
spirit_classic::space_p | spirit_classic::comment_p( '#' )
...

这可以跳过空格——但完全无法跳过注释(即从 '#' 到行尾的任何内容),我理解 `comment_p('#') 可以实现。

显然我理解错了。我只是不知道是什么。帮忙?

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