受CJSON库的启发,用C++实现解析Lua文件的库。
整个库大概800行代码,因为新鲜出炉,所以有些潜在问题尚未发现。
截图中包含使用例子。
以下接口清单:
LuaNode(); LuaNode(const char * bytes); LuaNode(const LuaNode & node); LuaNode(LuaNode && node); ~LuaNode(); LuaNode &operator=(const LuaNode & node); LuaNode &operator=(LuaNode && node); template <class KeyT> LuaNode &at(const KeyT & key); template <class KeyT> void remove(const KeyT & key); void setValue(int value); void setValue(bool value); void setValue(double value); void setValue(size_t value); void setValue(const char * value); void setValue(const std::string & value); template <class ValueT, class KeyT> void insert(ValueT value, const KeyT & key); template <class KeyT> void insert(const std::string & value, const KeyT & key); template <class ValueT> void insert(ValueT value); void insert(LuaNode &&value, const std::string & key); void insert(LuaNode &&value, const char * const & key); void insert(LuaNode &&value, const llong_t & key); void insert(LuaNode &&value, const size_t & key = SIZET_MAX); std::string &asString(); Array &asArray(); const std::string &asString() const; const Array &asArray() const; double asDouble() const; float asFloat() const; bool asBool() const; int asInt() const; EnumLuaNodeType getType() const; std::string toString() const;
通过 insert 插入节点。
通过 remove 移除节点。
通过 at 访问节点。
通过 as* 系列接口,返回具体值。
通过 toString 格式化打印 Lua 源码。
可通过字符串构造 LuaNode 对象。(不支持注释)
本库也可以用于 网络传输协议。
其实现难点在于从字符串构造 LuaNode 对象。
这里涉及到一些简单的词法分析。
通过依次推进字符串指针,逐字解析含义。
存储结构用的 std::vector。
我曾考虑使用 std::map,
但考虑以下几个问题:
1,强类型语言有数字和字符串之分,如果使用 map,则需要 map<int>, map<string>。
2,Lua 的 table 如果 key 全部为连续数字,则 table 是 array,如果使用 map,顺序无法保证,并且随机访问开销大。
3,实际应用中,很少有大量的 hash 处理,相反,却有很多 array 要处理。
4,CJSON 的实现里,也是用 array 做存储。
编译环境 VS 2015,64bit。
该库没有使用任何第三方库,目测是可跨平台的。
吐个槽,C++实现起来比C复杂太多。