【发布时间】:2021-02-04 16:58:44
【问题描述】:
我正在处理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[...] 包装器时,它有什么不同吗?
【问题讨论】:
标签: c++ boost-spirit-qi