我如何解析一个表达式嵌套括号与boost.Spirit
How do I parse an expression with nested parenthesis with boost.Spirit?
我需要解析包含键/值对和键/子表达式对的一行表达式,如:
123=a 456=b 789=(a b c) 111=((1=a 2=b 3=c) (1=x 2=y 3=z) (123=(x y z))) 666=evil
为了使解析器更简单,我愿意分几个步骤进行解析,分离第一级标记(这里是123、456,789、111和666),然后在另一个步骤中解析它们的内容。这里789的值是"a b c"
, 111的值是(1=a 2=b 3=c) (1=x 2=y 3=z) (123=(x y z))
。
但是语法在这一点上打败了我,所以我不能找到一种方法来获得匹配括号之间的表达式。我得到的所有111是(1=a 2=b 3=c
,它以第一个右括号结束。
我发现了这个方便的例子,并尝试使用它,但没有成功:
#include <map>
#include <string>
#include <boost/spirit/include/classic.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;
void main()
{
auto value = +qi::char_("a-zA-Z_0-9");
auto key = qi::char_("a-zA-Z_") >> *qi::char_("a-zA-Z_0-9");
qi::rule<std::string::iterator, std::pair<std::string, std::string>()> pair = key >> -('=' >> value);
qi::rule<std::string::iterator, std::map<std::string, std::string>()> query = pair >> *((qi::lit(';') | '&') >> pair);
std::string input("key1=value1;key2;key3=value3"); // input to parse
std::string::iterator begin = input.begin();
std::string::iterator end = input.end();
std::map<std::string, std::string> m; // map to receive results
bool result = qi::parse(begin, end, query, m); // returns true if successful
}
我怎么能做到呢?
编辑:我在http://boost-spirit.com/home/articles/qi-example/parsing-a-list-of-key-value-pairs-using-spirit-qi/
你可以这样写:
qi::rule<std::string::iterator, std::pair<std::string, std::string>()> pair =
key >> -(
'=' >> ( '(' >> raw[query] >> ')' | value )
)
;
将所有嵌入查询存储为与键相关的值(字符串)。不过,这将从存储的值中删除括号。如果您仍然希望将括号存储在返回的属性中,请使用:
qi::rule<std::string::iterator, std::pair<std::string, std::string>()> pair =
key >> -(
'=' >> ( raw['(' >> query >> ')'] | value )
)
;
相关文章:
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- 在nlohmann json中,如何将嵌套对象的数组转换为嵌套结构的向量
- 嵌套的匿名命名空间
- 了解嵌套循环打印星号图案
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 嵌套for循环C++的问题(初学者)
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 用C#中的并集模拟C++嵌套结构
- 部分专业化和嵌套模板
- 嵌套While循环不起作用(C++问题)
- 使用 Boost.Spirit 解析嵌套列表
- 如何访问boost::spirit::karma中嵌套对象的数据
- 我如何解析一个表达式嵌套括号与boost.Spirit