前言
最近看到这篇文章,
json引擎性能对比报告 http://www.oschina.net/news/61942/cpp-json-compare?utm_source=tuicool
感觉技术真是坑好多, 显露的高山也很多. 自己原先也 对着
json 标准定义 http://www.json.org/json-zh.html
写过一般json解析器, 1000行后面跟上面一对比, 真是弱鸡. 后面就看了其中吹得特别掉几个源码,确实有过人之处,深感
自己不足. 下载一些也在研究,发现看懂会用和会设计开发是两码事.
对于json设计主要基础点是在 结构设计和语法解析 . 继续扯一点对于一个框架的封装在于套路,套路明确,设计就能糅合
在一起. 不管怎样,只要学了,总会优化的. 下面 我们分享的比较简单, 但也是围绕结构设计 和 语法解析方面, 给C框架来个 配置
读取的能力.
正文
1.解析文件说明
这里先展示配置文件的直观展示如下 test.php
<?php // 这里是简单测试 php 变量解析 $abc = "123456"; $str = "1231212121212121212 21222222222 2121212" ";
我们只需要解析上面数据, 保存在全局区下次直接调用就可以了. 例如
运行的结果如上. 对于上面配置 有下面几个规则
a. $后面跟变量名
b.中间用 = 分割
c.变量内容用 ""包裹, 需要用" 使用"
上面就是配置的语法规则.下面我们逐渐讲解 语法解析内容
2.简单的核心代码,语法解析测试
具体的扫描算法如下
a.跳过开头空白字符 找到$字符
b.如果$后面是空白字符,那么直接 读取完毕这行
c.扫描到 = 字符,否则读取完毕这行
d扫描到 " 字符
e扫描到最后"字符,必须 前一个字符不是 , 否则读取这行完毕.
上面就是 处理的算法思路,比较容易理解, 具体测试代码如下
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #define _STR_PATH "test.php" /* * 这里处理文件内容,并输出解析的文件内容 */ int main(int argc, char* argv[]) { int c, n; char str[1024]; int idx; FILE* txt = fopen(_STR_PATH, "rb"); if (NULL == txt) { puts("fopen is error!"); exit(EXIT_FAILURE); } //这里处理读取问题 while ((c = fgetc(txt))!=EOF){ //1.0 先跳过空白字符 while (c != EOF && isspace(c)) c = fgetc(txt); //2.0 如果遇到第一个字符不是 '$' if (c != '$') { //将这一行读取完毕 while (c != EOF && c != ' ') c = fgetc(txt); continue; } //2.1 第一个字符是 $ 合法字符, 开头不能是空格,否则也读取完毕 if ((c=fgetc(txt))!=EOF && isspace(c)) { while (c != EOF && c != ' ') c = fgetc(txt); continue; } //开始记录了 idx = 0; //3.0 找到第一个等号 while (c!=EOF && c != '=') str[idx++]=c, c = fgetc(txt); if (c != '=') //无效的解析直接结束 break; //4.0 找到 第一个 " while (c != EOF && c !='"') str[idx++] = c, c = fgetc(txt); if (c != '"') //无效的解析直接结束 break; //4.1 寻找第二个等号 do { n = str[idx++] = c; c = fgetc(txt); } while (c != EOF && c != '"' && n != '\'); if (c != '"') //无效的解析直接结束 break; str[idx] = '