简单解析器的简单方法

时间:2011-08-11 18:17:49

标签: c++ parsing analysis lexical

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

  

Variable_name = Value;

     

VARIABLE_2 = SECOND_VALUE;

找到有效的方法,但使用很多图书馆,如Boost。我想知道你是否可以做一个简单,最好只有 STD 的图书馆。

谢谢,Bruno Alano。

5 个答案:

答案 0 :(得分:3)

如果变量和值不能包含等号或分号,并且您可以假设文件总是格式良好,那么这很简单。

抓住所有内容,直到你达到分号。将字符串拆分为=符号。第一部分是您的变量名称。第二部分是价值。

如果您必须处理评论,字符串文字值(可能包含=;)这是非繁体,您应该使用{{1} }。

如果您想知道如何分割字符串,那么就该主题提出了许多问题,其中一个特别好的问题是:Split a string in C++?

答案 1 :(得分:3)

如果您的格式将保持原样,并且变量名称或值中没有空格,则可以使用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&)

答案 2 :(得分:1)

它基本上与INI文件不同。

快速搜索出现: http://code.google.com/p/inih/

哪个具有最小的依赖性。

如果需要,可能很容易删除部分处理。

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

至少是一个起点。

答案 3 :(得分:1)

您可以使用lemon parser generator,它会在stdlibc旁边生成一个没有依赖项的文件。 Here是一个很好的入门教程。

作为扫描仪,我更喜欢re2c,这也是公共领域。

如果你真的需要C ++,你可以将yyparse()函数包装在C ++类中。

答案 4 :(得分:1)

真正的简短(C风格)方法类似于:

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