簡體   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