我想用C ++解析一个文本文件。我知道文件的语法,从计算机科学的角度来看,我不认为我有任何问题。但是,我不知道如何在C ++中实现解析器。我认为有很多可能性:
flex / yacc:我认为工具链有点过时了,我认为它不会对我的其他程序有效。
plain C:我可以将整个文件读入一个char数组并使用指针进行随机访问。问题是文本文件可能很大,我真的不想将它们一直存储在内存中。
C ++ istreams:我认为这里的问题是在解析文件的过程中我需要某种前瞻性。如果表达式不匹配,那么我当然必须把我读到的字符放回到流中。我认为使用C ++中的ungetch函数会变得相当难看。此外,由于表达式可能相当长,因此窥视功能对我来说可能不够。
使用boost:Boost提供正则表达式,这对于识别令牌是完美的,但就我的研究而言,不可能匹配正则表达式并在istream的上下文中使用令牌。
我还使用javacc和java一段时间后我不得不说我对它印象非常深刻。但是我不认为C ++中有这样的东西,有吗?
如果在该领域有经验的人能指出我正确的方向,我将非常感激。
答案 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视为解析器生成器。