繁体   English   中英

C Library使用基于大括号的语法读取配置文件

[英]C Library to read configuration files with syntax based on curly brackets

对于我的C项目,我想使用基于大括号的配置文件,例如:

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

等或某些变化。

我正在尝试找到一些不错的C库来满足我的需求。 你能给些建议么?

你想要的语法几乎与Lua相同,看起来像这样:

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

如果这适合你,我强烈推荐Lua,因为它可以作为配置或脚本工具嵌入C程序中。 您可以使用原始Lua C API,或者如果您更喜欢C ++,可以使用像Luabind这样的东西来使某些东西更漂亮。

这是一个简单的例子,使用纯C Lua API从包含Lua“块”的缓冲区中检索值: http//lua-users.org/wiki/GettingValuesFromLua 您基本上可以在C中读取(或mmap)配置文件,将指向文本的指针传递给Lua,让Lua执行它,然后迭代地检索位和碎片。 另一种方法是进行“绑定”( Lua wiki上也有一个例子 )。 通过绑定,流更像是设置C结构来表示配置数据,将它们绑定到Lua,并让Lua配置脚本实际填充(构造)一个配置对象,然后可以从C访问。具体取决于您的确切需求这可能更好或更糟,但在纯C(而不是C ++)中,学习曲线可能比“获取值”方法更陡峭。

我建议使用lexer和解析器来执行此操作, lex / yacc combo或flex / bison

您基本上在.l.y文件中编写代码来描述布局,而词法分析器/解析器生成器创建将为您处理文件的C代码,调用函数将数据传递给您。

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

在词法分析器中,你可以识别词汇元素

  • e_account (account)
  • e_openbrace ({)
  • e_name (name)
  • e_string ("[^"]*")
  • e_semicolon (;)

等等。

解析器使用词法分析器来检测词法元素,并且解析器具有用于确定哪些构造有效的更高级别规则。 像帐户部分e_accounte_openbrace ,零或更多的e_stanza然后最终e_closebrace 并且还将e_stanza检测为e_namee_equalse_string e_semicolon

大部分情报都在幕后(至少对于lex / yacc而言,看起来非常丑陋的代码),但它比自己编写它更好:-)

您描述的变体是JSON:

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

列出~100个库,用于为每种可想到的平台和语言读写JSON。 C单独有七个库.JSON的好处当然是互操作性,并且有一种被广泛接受的数据格式(它甚至有一个RFC:rfc4627)

libconfuse几乎具有您需要的语法:

/*
 * This is a C-style multi-line comment
 */

BackLog = 2147483647

bookmark heimdal {
    login = "anonymous"
    password = ${ANONPASS:-anonymous@} # environment variable substitution
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM