解析c++文本文件的例程

Routines for parsing a text file in C++

本文关键字:例程 文件 文本 c++ 解析      更新时间:2023-10-16

我想用c++解析一个文本文件。我知道这个文件的语法,从计算机科学的角度来看,我认为我没有任何问题。然而,我不知道如何在c++中实现解析器。我认为有很多可能性:

  1. flex/yacc:我认为这个工具链有点过时了,我认为它不能很好地与我的程序的其余部分一起工作。

  2. plain C:我可以将整个文件读取到一个字符数组中,并使用指针进行随机访问。问题是文本文件可能很大,我真的不想一直把它们存储在内存中。

  3. c++ istreams:我认为这里的问题是,在解析文件的过程中,我当然需要某种向前看。如果表达式不匹配,那么我当然必须把目前为止读到的字符放回流中。我认为在c++中使用ungetch函数会变得相当难看。此外,由于表达式可能相当长,peek函数可能不适合我。

  4. 使用boost: boost提供正则表达式,这将是完美的识别令牌,但就我的研究而言,不可能匹配正则表达式并在istream的上下文中使用令牌。

我之前也用过javacc和java,我不得不说我对它印象非常深刻。然而,我不认为c++中有这样的东西,是吗?

如果有人在这方面有经验的话,我将非常感激。

如果这是真的:

C:我可以将整个文件读入一个字符数组,并使用指针进行随机访问。问题是文本文件可能很大,我真的不想一直把它们存储在内存中。

你应该查看内存映射文件。

Iczelion有一个很好的关于内存映射文件的Windows API的教程。

POSIX提供mmap()。Beej在一个新的地址上重新上线了,并在这里提供了一个使用示例。

Boost还提供了一种独立于平台的方式来使用上述内容。我不太了解它,因为我宁愿自己写这样的东西。我相信它有它的优点。Boost在这里有一个关于它的页面。

Stack Overflow有一个关于解析mmap()文件的问题。

您也可以将ANTLR视为解析器生成器。