![](/img/trans.png)
[英]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.