简单解析器的简单方法

Simple Method to a Simple Parser

本文关键字:简单 方法      更新时间:2023-10-16

我试图创建一个简单的解析器和一个小文本文件,遵循以下结构:

Variable_name = Value;

VARIABLE_2 = SECOND_VALUE;

找到了工作的方法,然而,使用许多库,如Boost。我想知道您是否可以使简单,最好只有STD的库。

谢谢你,Bruno Alano。

如果您的格式将保持您所列出的格式,并且在变量名或值中没有空格,则可以轻松地使用std::stringstd::istringstream的组合。您可以简单地执行以下操作:

//assume we have an open ifstream object called in_file to your file
string line;
getline(in_file, line);
while (in_file.good())
{
    char variable[100];
    char value[100];
    char equals;
    //get rid of the semi-colon at the end of the line
    string temp_line = line.substr(0, line.find_last_of(";"));
    istringstream split_line(temp_line);
    //make sure to set the maximum width to prevent buffer overflows
    split_line >> setw(100) >> variable >> equals >> value;
    //do something with the string data in your buffers
    getline(in_file, line);
}

你可以改变variablevalue的类型,以适当地适应你的需要…它们不需要是char缓冲区,但可以是任何其他类型,只要istream& operator>>(istream&, type&)是为您想要使用的数据类型定义的。

如果变量和值不能包含等号或分号,并且您可以假设文件总是格式良好,那么这样做是微不足道的。

抓住所有东西,直到到达分号。在=符号处拆分字符串。第一部分是变量名。第二部分是值。

如果你必须处理注释,字符串文字值(可能包含=;),这是 nontrivial ,你应该使用boost.Spirit

如果你想知道如何分割字符串,有很多关于这个主题的问题,其中一个特别好的问题是:在c++中分割字符串?

它基本上和INI文件没有什么不同。

快速搜索得到这样的结果:http://code.google.com/p/inih/

具有最小的依赖关系。

如果需要的话,去掉部分处理可能很容易。

您需要添加分号的处理,分号通常是INI文件中注释的开始。

真正简短的(c风格)方法应该是这样的:

scanf("%s = %[^n]", variable_name, value);

您可以使用lemon解析器生成器,它生成一个除了stdlibc之外没有任何依赖项的文件。这是一个很好的入门教程。

作为一个扫描器,我更喜欢re2c,它也是公共领域。

如果你真的需要c++,你可以把yyparse()函数包装在一个c++类中。