我正在研究https://github.com/F-Bergemann/RegexSplitter https://github.com/F-Bergemann/RegexSplitter.
目的:解析正则表达式字符串,并创建可破坏和不可破坏的顶级子字符串。可分解的子串可以再次分解。牢不可破的子字符串必须保持原样。 Unbreakable 适用于“团体”和“角色类别”
我目前正在研究“角色课程”。对于这些,我主要使用 qi::rule 解析器,并且仅使用单个 qi::rule 解析器作为根解析器。 IE。只有根解析器才能创建 AST 结果。子解析器将仅进行验证。
当测试编译的正则表达式分割器时,我得到这个:
> ./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]
IE。我得到的结果不是“[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]”?
它应该只是验证语法并返回原始数据。
我试图找出解析器操作在这里发生了什么。
我这里没有明确的解析器操作。
它正在使用什么隐含地?升压::变体<...>?
当我使用 qi::as_string[...] 包装器时,这有什么区别吗?
这是古老的“容器属性不是原子的”陷阱:
- boost::spirit::qi 对输出进行重复解析 https://stackoverflow.com/questions/13869978/boostspiritqi-duplicate-parsing-on-the-output/13875183#13875183
- 理解 Boost.spirit 的字符串解析器 https://stackoverflow.com/questions/21959270/understanding-boost-spirits-string-parser/21960981#21960981
- 使用 Boost::Spirit (V2.4) 解析到容器中 https://stackoverflow.com/questions/3912674/parsing-with-boostspirit-v2-4-into-container/3915892
你可以用纸覆盖它qi::hold
。或者你可以修改你的策略。
我会看看是否可以抽出时间来检查代码。为了获得更好的效果,您可以在 CodeReview.stackexchange.com 上发帖。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)