用于在C ++中解析文本文件的例程

时间:2011-11-01 18:48:53

标签: c++ parsing

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

  1. flex / yacc:我认为工具链有点过时了,我认为它不会对我的其他程序有效。

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

  3. C ++ istreams:我认为这里的问题是在解析文件的过程中我需要某种前瞻性。如果表达式不匹配,那么我当然必须把我读到的字符放回到流中。我认为使用C ++中的ungetch函数会变得相当难看。此外,由于表达式可能相当长,因此窥视功能对我来说可能不够。

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

  5. 我还使用javacc和java一段时间后我不得不说我对它印象非常深刻。但是我不认为C ++中有这样的东西,有吗?

    如果在该领域有经验的人能指出我正确的方向,我将非常感激。

2 个答案:

答案 0 :(得分:1)

如果是这样的话:

  

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

你应该研究memory mapped files

Iczelion在内存映射文件here的Windows API上有一个很好的教程。

POSIX提供mmap()。 Beej显然已在新地址重新上线,并提供了使用here的示例。

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

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

答案 1 :(得分:0)

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