boost::spirit 替代解析器返回重复项

问题描述

我正在处理https://github.com/F-Bergemann/RegexSplitter
目的:解析一个正则表达式字符串,创建可破解和不可破解的顶级子串。可分解的子串可以再次分解。牢不可破的子字符串必须保持原样。牢不可破适用于“组”和“字符类”
我目前正在研究“字符类”。对于那些,我主要使用 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]

即我得到的结果不是“[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[...] 包装器时,这有什么不同吗?

解决方法

这是一个古老的“容器属性不是原子的”陷阱:

您可以使用 qi::hold 将其覆盖。或者您可以修改您的策略。

我会看看我是否能找到一些时间来查看代码。您可以在 CodeReview.stackexchange.com 上发帖以获得良好的衡量标准。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...