- 论坛徽章:
- 0
|
本帖最后由 AD8018 于 2011-11-26 16:06 编辑
楼主非常用功,很不错,赞!
另外建议楼主用语法解析器来做,
争取早日从这种苦逼的要死的境地走出来。
AD以前也这么苦逼过,还写过不少苦逼代码,感觉浪费了很多的脑力。
这是一个用C++ spirit库实现的解析INI的代码:
http://www.codeproject.com/KB/tips/ini_file_parser_spirit.aspx
定义规则,出结果,十分的一目了然。
- rule<> char_ident_start = alpha_p | ch_p('_') ;
- rule<> char_ident_middle = alnum_p | ch_p('_') ;
- rule<> ident = char_ident_start >> * char_ident_middle ;
- rule<> char_start_comment = ch_p('#') | ch_p(';') | str_p("//");
- rule<> blanks_p = * blank_p;
- rule<> value_p = * ( alnum_p | blank_p | punct_p );
-
- rule<> l_category =
- blanks_p >>
- ch_p('[') >>
- blanks_p >>
- ident [ addCategory ] >>
- blanks_p >>
- ch_p(']') >>
- blanks_p >>
- eol_p
- ;
-
- rule<> l_comment = blanks_p >> char_start_comment >> * print_p >> eol_p;
- rule<> l_empty = blanks_p >> eol_p;
- rule<> c_comment_rule = confix_p("/*", *anychar_p, "*/");
- rule<> b_comment =
- blanks_p >>
- c_comment_rule >>
- blanks_p >>
- eol_p
- ;
- rule<> l_entry =
- blanks_p >>
- ident [ addName ] >>
- blanks_p >>
- ch_p('=') >>
- blanks_p >>
- value_p [ addValue ] >>
- blanks_p >>
- eol_p
- ;
- rule<> lines = l_comment | b_comment | l_category | l_entry | l_empty;
- rule<> ini_file = lexeme_d [ * lines ] ;
- file_data.clear();
-
- int errcode = parse(buffer, ini_file).full;
复制代码 |
|