我有一个数据文件格式,其中包括
- /* 注释 */
- /* 嵌套的 /* 注释 */ 太 */ 和
- // c++ 风格的单行注释..
像往常一样,这些注释可以出现在输入文件中允许正常空白的任何地方。
因此,我没有通过普遍的注释处理来污染语法,而是制作了一个处理空白和各种注释的跳过解析器。
到目前为止一切顺利,我能够解析我所有的测试用例。
但是,在我的用例中,如果存在一个或多个注释,则任何解析值(双精度、字符串、变量、列表...)都必须将其前面的注释作为属性携带。也就是说,我的双精度 AST 节点应该是
struct Double {
double value;
std::string comment;
};
对于我在语法中的所有值,依此类推。
因此,我想知道是否有可能以某种方式将收集到的评论“存储”在船长解析器中,然后让它们可用于以正常语法构建 AST 节点?
处理评论的船长:
template<typename Iterator>
struct SkipperRules : qi::grammar<Iterator> {
SkipperRules() : SkipperRules::base_type(skipper) {
single_line_comment = lit("//") >> *(char_ - eol) >> (eol | eoi);
block_comment = ((string("/*") >> *(block_comment | char_ - "*/")) >> string("*/"));
skipper = space | single_line_comment | block_comment;
}
qi::rule<Iterator> skipper;
qi::rule<Iterator, std::string()> block_comment;
qi::rule<Iterator, std::string()> single_line_comment;
};
我可以在船长规则中使用全局变量和语义操作来存储评论,但这似乎是错误的,并且通常在解析器回溯中可能不会很好地发挥作用。什么是存储评论的好方法,以便以后可以在主语法中检索它们?