Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C库读取基于花括号语法的配置文件_C_Configuration Files - Fatal编程技术网

C库读取基于花括号语法的配置文件

C库读取基于花括号语法的配置文件,c,configuration-files,C,Configuration Files,对于我的C项目,我希望使用基于花括号的配置文件,如: account { name = "test@test.com"; password = "test"; autoconnect = true; } 等等,或者一些变化 我正在寻找一些好的C库来满足我的需要。您能提供建议吗?我建议使用lexer和解析器来完成这项工作,可以使用/combo或/ 基本上,您可以在.l和.y文件中编写代码来描述布局,并且lexer/parser生成器创建C代码来为您处理文件,调用函数将数据

对于我的C项目,我希望使用基于花括号的配置文件,如:

account {
    name = "test@test.com";
    password = "test";
    autoconnect = true;
}
等等,或者一些变化


我正在寻找一些好的C库来满足我的需要。您能提供建议吗?

我建议使用lexer和解析器来完成这项工作,可以使用/combo或/

基本上,您可以在
.l
.y
文件中编写代码来描述布局,并且lexer/parser生成器创建C代码来为您处理文件,调用函数将数据传递给您

除非你精通这门艺术,否则词汇分析和句法分析是一件很痛苦的事情。像我提到的那些工具使这项工作容易得多

在lexer中,您可以识别词汇元素,如

  • e\u账户(账户)
  • e_openbrace({)
  • e_name(name)
  • e_字符串(“[^”]*”)
  • e_分号(;)
等等

语法分析器使用词法分析器来检测词法元素,语法分析器有更高级别的规则来决定哪些构造是有效的。例如帐户部分是
e_account
e_openbrace
,零个或多个
e_节
,最后是
e_closebrace
。还检测
e_节
作为(除其他外)
e_名称
e_等于
e_字符串
,然后是
e_分号


大多数智能都是隐藏的(至少对于lex/yacc来说,代码看起来很难看),但这比尝试自己编写要好:-)

您想要的语法几乎与相同,如下所示:

account = {
    name = "test@test.com",
    password = "test",
    autoconnect = true,
}

如果你适合,我强烈推荐Lua,因为它被设计成嵌入在C程序中作为一个配置或脚本工具。你可以使用原始的LuaC API,或者如果你喜欢C++,有一些东西可以使语言中的某些东西更漂亮。


下面是一个简单的示例,使用纯C Lua API从包含Lua“块”的缓冲区检索值。您基本上可以用C读取(或mmap)配置文件,将指向文本的指针传递给Lua,让Lua执行它,然后迭代检索位和段。另一种方法是执行“绑定”使用绑定,流程更像是设置C结构来表示配置数据,将它们绑定到Lua,并让Lua配置脚本实际填充(构造)一个配置对象,然后从C访问该对象。根据您的具体需要,这可能更好,也可能更差,但在纯C中(与C++相反),学习曲线可能比“获取值”方法更陡峭。

您所描述的JSON变体:

account={
    name: "test@test.com",
    password: "test",
    autoconnect: true
}
列出了每种可能的平台和语言大约100个用于读写JSON的库。仅C语言就有7个库。JSON的好处当然是互操作性,并且具有广泛接受的数据格式(它甚至有一个RFC:rfc4627)

几乎符合您的语法要求:

/* * This is a C-style multi-line comment */ BackLog = 2147483647 bookmark heimdal { login = "anonymous" password = ${ANONPASS:-anonymous@} # environment variable substitution } /* *这是一个C风格的多行注释 */ 积压=2147483647 书签海姆达尔{ login=“匿名” 密码=${ANONPASS:-匿名@}#环境变量替换 }
为此,我想推荐Ragel,它可以生成扫描程序,并且语法相当简单。+1:实际上,Lua的设计目标之一是可以用作配置语言。