[英]Question about C Syntax: Nested curly brackets for struct declaration mid-function?
[英]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_account
, e_openbrace
,零或更多的e_stanza
然后最终e_closebrace
。 并且还将e_stanza
检测为e_name
, e_equals
, e_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.