简单的方法来制作一个简单的解析器

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

Variable_name = Value;

VARIABLE_2 = SECOND_VALUE;

找到了一些可行的方法,但是它们使用了许多库,比如Boost。我想知道是否可以使用简单的、最好只使用STD
谢谢,Bruno Alano。

对于像您这样的情况,您可以在 = 上进行拆分,将左侧作为变量,右侧作为值。 - cristian
5个回答

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);
}

您可以更改变量的类型以适应您的需求...它们不需要是char缓冲区,但可以是任何其他类型,只要为您想要使用的数据类型定义了istream& operator>>(istream&, type&)


3
如果变量和值不能包含等号或分号,并且您可以假设文件始终是格式良好的,则这很容易做到。获取直到遇到分号为止的所有内容。在等号标记处拆分字符串。第一部分是您的变量名。第二个部分是值。 如果您必须处理注释、字符串文字值(可能包含=或;),则这是非常困难的,您应该使用boost.Spirit。 如果您想知道如何拆分字符串,有许多关于该主题的问题,特别好的一个问题是:在C++中拆分字符串?

1

非常简短的(C风格)方法可能是这样的:

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

1

它基本上与INI文件相似。

快速搜索得到了这个: http://code.google.com/p/inih/

它具有最小的依赖关系。

如果需要,很可能很容易剥离部分处理。

但是,您需要添加分号处理,因为在INI文件中通常是注释的开头。

至少它是一个起点。


1
你可以使用lemon parser generator,它会生成一个除了stdlibc之外没有依赖的文件。这里有一个很好的入门教程。
作为一个扫描器,我更喜欢re2c,它也是公共领域的。
如果你真的需要C++,你可以将yyparse()函数封装在一个C++类中。

Lemon解析器很好,但它基本上专注于C,是吧? - john
C和C++可以相互操作。只需使用 extern "C" 即可。所有用于C ++的解析器生成器都会提供一个类(以及许多其他你不想要的废物),这就是C ++的重点所在。对于C,你会得到一个函数,你可以随意嵌入。 - Flavius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接