受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复杂太多。

源码下载

LuaNode 开源库的更多相关文章

  1. 【踩坑速记】开源日历控件,顺便全面解析开源库打包发布到Bintray/Jcenter全过程(新),让开源更简单~

    一.写在前面 自使用android studio开始,就被它独特的依赖方式:compile 'com.android.support:appcompat-v7:25.0.1'所深深吸引,自从有了它,麻 ...

  2. Java下好用的开源库推荐

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 本文想介绍下自己在Java下做开发使用到的一些开源的优秀编程库,会不定 ...

  3. 第三方开源库和jar包的区别

    jar包和第三方开源库的根本区别在于,开源库的功能比jar包功能更强大,通过引入库项目可以访问java文件以及该开源库项目下的资源文件,例如图片,layout等文件 jar包中只能放class文件 引 ...

  4. 【转】用JitPack发布开源库时附加文档和源码

    来自:http://www.gcssloop.com/course/jitpack-sources-javadoc 用JitPack发布开源库时附加文档和源码 很早之前写过一篇用JitPack发布An ...

  5. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  6. GitHub上那些值得一试的JAVA开源库--转

    原文地址:http://www.jianshu.com/p/ad40e6dd3789 作为一名程序员,你几乎每天都会使用到GitHub上的那些著名Java第三方库,比如Apache Commons,S ...

  7. .NET蓝牙开源库:32feet.NET

    在用C#调用蓝牙编程一文中我留个小悬念就是:InTheHand.Net.Personal.dll是怎么来的?这篇文章来解答这个问题,InTheHand.Net.Personal.dll就是来源于今天要 ...

  8. Android Studio 简介及导入 jar 包和第三方开源库方[转]

    原文:http://blog.sina.com.cn/s/blog_693301190102v6au.html Android Studio 简介 几天前的晚上突然又想使用 Android Studi ...

  9. 快快快!27个提升效率的iOS开源库推荐

    文章来源:http://www.csdn.net/article/2015-07-21/2825264-27-ios-open-source-libraries/1 我热爱开源,更喜爱那些花费宝贵的业 ...

随机推荐

  1. Android核心基础(手机卫士的一个知识点总结)

    注意:有些功能是需要权限的,在这里并没有写出来,在程序运行中,根据程序报的错误,添加相应的权限即可,里面的具体里面可能有一些小细节,没有明确的写出来,具体的需要在程序中自己调试,解决. 这个总结涵盖了 ...

  2. Bzoj 3289: Mato的文件管理 莫队,树状数组,逆序对,离散化,分块

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1539  Solved: 665[Submit][Status][Di ...

  3. 为 Joomla 而生的 Kunena 论坛安装手册

    查看并下载最新版本Kunena论坛,或直接下载Kunena1.7.2.如果你打算在Joomla网站中安装一个论坛,可以考虑一下Kunena论坛组件,一个为Joomla而生的免费的开源论坛组件. 安装: ...

  4. 怎样在Yii中显示静态页

    在web应用中,我们经产更需要显示静态页,如“关于我们”等,这些文件通常是静态页,通常有如下几种处理方法: 1.把独立的html文件存在Web服务器能直接访问的目录下.这种方案的缺点是很难维护网页布局 ...

  5. MySQL数据库MyISAM和InnoDB存储引擎的比较(转)

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种.这里介绍关于这两种引擎的一些基本概念(非深入介绍). MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索 ...

  6. JavaScript面向对象继承方法

    JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是JavaScript的类型非常松散,也没有编译器.这样一来 ...

  7. getaccesstoken方法

    通过appid和appsecret获取access_token的定义函数 这里用的是memcache缓存存储用户信息7000秒 <?php function getAccessToken($ap ...

  8. Linux中查看系统资源占用情况的命令【转载】

      用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载 ...

  9. 绿色tftpserver:tftpd32的配置

    嵌入式开发中少不了用到TFTP服务,它的功能主要是用来给目标板传输文件. tftpd32.exe是如今最经常使用的TFTPserver,今天就来介绍它的配置方法. 1.从这里 下载新版本号tftpd3 ...

  10. oracle16 例外

    例外处理 例外的分类 oracle将例外分为预定义例外,非预定义例外和自定义例外三种. 预定义例外用于处理常见的oracle错误 非预定义例外用于处理预定义例外不能处理的例外 自定义例外用于处理与or ...