gpt4 book ai didi

c++ - 如何在 Boost.Spirit 中跳过行/ block /嵌套 block 注释?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:48 25 4
gpt4 key购买 nike

在使用Boost.Spirit解析语言时,如何保证跳过

// line comments

/* block
comments */ and

/* /* nested
block */ comments */

在阅读代码时?目前,我只是将 phrase_parse 转换为预定义的 qi::grammar。我想我需要的是某种跳过词法分析器,对吧?

最佳答案

不需要词法分析器。

这是一个实现它的示例语法:Cross-platform way to get line number of an INI file where given option was found,但无论如何您都可以使用这样的 skipper :

using Skipper = qi::rule<Iterator>;

Skipper block_comment, single_line_comment, skipper;

single_line_comment = "//" >> *(char_ - eol) >> (eol|eoi);
block_comment = "/*" >> *(block_comment | char_ - "*/") > "*/";

skipper = single_line_comment | block_comment;

当然如果空格也是可跳过的,使用

skipper = space | single_line_comment | block_comment;

这支持嵌套 block 注释,如果缺少 qi::expectation_failure<> 则抛出 */

请注意,它特别不支持以单行注释开头的 block 注释。

演示

Live On Coliru

#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;

int main() {
using Iterator = boost::spirit::istream_iterator;
using Skipper = qi::rule<Iterator>;

Skipper block_comment, single_line_comment, skipper;

{
using namespace qi;
single_line_comment = "//" >> *(char_ - eol) >> (eol|eoi);
block_comment = ("/*" >> *(block_comment | char_ - "*/")) > "*/";

skipper = space | single_line_comment | block_comment;
}

Iterator f(std::cin >> std::noskipws), l;

std::vector<int> data;
bool ok = phrase_parse(f, l, *qi::int_, skipper, data);
if (ok) {
std::copy(data.begin(), data.end(), std::ostream_iterator<int>(std::cout << "Parsed ", " "));
std::cout << "\n";
} else {
std::cout << "Parse failed\n";
}

if (f!=l) {
std::cout << "Remaining unparsed: '" << std::string(f,l) << "'\n";
}
}

打印:

Parsed 123 456 567 901 

给定输入

123 // line comments 234

/* block 345
comments */ 456

567

/* 678 /* nested
789 block */ comments 890 */

901

关于c++ - 如何在 Boost.Spirit 中跳过行/ block /嵌套 block 注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44529864/

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