我无法使用Boost :: Spirit编写我认为应该是简单解析器的内容.(我使用的是Spirit而不仅仅是使用字符串函数,因为这对我来说是一个学习练习).
要解析的数据采用键值对的形式,其中值本身可以是键值对.键是字母数字(带下划线,没有数字作为第一个字符); 值是字母数字加.-_- 值可以是格式的日期,DD-MMM-YYYY例如01-Jan-2015浮点数,例如3.1415普通的旧字母数字字符串.键和值分开=; 对分开;; 结构化值用{... 分隔}.目前我正在从用户输入中删除所有空格,然后将其传递给Spirit.
输入示例:
Key1 = Value1; Key2 = { NestedKey1=Alan; NestedKey2 = 43.1232; }; Key3 = 15-Jul-1974 ;
然后我会删除所有空格
Key1=Value1;Key2={NestedKey1=Alan;NestedKey2=43.1232;};Key3=15-Jul-1974;
然后我实际将它传递给Spirit.
当价值只是价值时,我现在所拥有的只是花花公子.当我开始在输入中编码结构化值时,Spirit会在第一个结构化值之后停止.如果只有一个结构化值,则解决方法是将其放在输入的末尾...但有时我需要两个或更多结构化值.
以下编译VS2013并说明错误:
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/include/pair.hpp>
#include <boost/fusion/adapted.hpp>
#include <map>
#include <string>
#include <iostream>
typedef std::map<std::string, std::string> ARGTYPE;
#define BOOST_SPIRIT_DEBUG
namespace qi = boost::spirit::qi;
namespace fusion = boost::fusion;
template < typename It, typename …Run Code Online (Sandbox Code Playgroud) 假设我们有一个抽象工厂的实现,调用如下:
std::string ObjectName = "An Object Name";
std::string Args = "Argument passed directly to constructor by the factory";
std::unique_ptr<MyBaseClass> MyPtr(ObjectFactory::Instance().Construct(ObjectName,Args));
Run Code Online (Sandbox Code Playgroud)
工厂使用std::map转"An Object Name"成一个构造函数,它本身需要一个std::string作为参数.这个想法是用户比我更了解构造的对象,所以我应该放弃并让用户将他们想要的任何信息传递给构造函数.
这Args恰好是预期的形式,但我不知道处理duff输入的最惯用的方式.如果用户提供无效的参数字符串会发生什么?
我能想到以下几点:
bool Validate(std::string x)方法,该方法检查是否x是有效的参数字符串bool成员变量,如果为true,则表示"此对象不处于理智状态"