问题描述
我正在处理https://github.com/F-Bergemann/RegexSplitter。
目的:解析一个正则表达式字符串,创建可破解和不可破解的顶级子串。可分解的子串可以再次分解。牢不可破的子字符串必须保持原样。牢不可破适用于“组”和“字符类”
我目前正在研究“字符类”。对于那些,我主要使用 qi::rule
当测试编译的正则表达式拆分器时,我得到了这个:
> ./regex-splitter "[1]"
TEST:[1]
### ASTNode c'tor (std::string &) #1: Unbreakable
### ASTNode c'tor (std::string &) #2: U:[11]
### ASTNode c'tor (ASTNode const *,std::vector<ASTNode *> &) #1: Collection
### ASTNode d'tor #1: Unbreakable
### ASTNode d'tor #2: U:[11]
### ASTNode c'tor (ASTNode const *,std::vector<ASTNode *> &) #2: Collection
U:[11],### ASTNode d'tor #1: Collection
### ASTNode d'tor #2: C:[11]
即我得到的结果不是“[1]”,而是“[11]”。
我知道这与以下代码部分有关:
tok_set_item =
tok_range | tok_char
;
tok_range =
tok_char >> qi::char_('-') >> tok_char
;
tok_char =
qi::alnum // Todo BNF: <char> ::= any non Metacharacter | "\" Metacharacter
;
似乎在尝试 tok_range,1st。然后切换到tok_char。
但是为什么我会在这里得到“[11]”?
它应该只是验证语法并返回原始数据。
我试图在这里找出解析器操作会发生什么。
我这里没有明确的解析器操作。
它隐式在使用什么? boost::variant<...>?
当我使用 qi::as_string[...] 包装器时,这有什么不同吗?
解决方法
这是一个古老的“容器属性不是原子的”陷阱:
- boost::spirit::qi duplicate parsing on the output
- Understanding Boost.spirit's string parser
- Parsing with Boost::Spirit (V2.4) into container
您可以使用 qi::hold
将其覆盖。或者您可以修改您的策略。
我会看看我是否能找到一些时间来查看代码。您可以在 CodeReview.stackexchange.com 上发帖以获得良好的衡量标准。