用于在C++; 我想用C++解析一个文本文件。我知道文件的语法,从计算机科学的角度来看,我认为我没有任何问题。但是,我不知道如何在C++中实现解析器。我认为有很多可能性:
flex/yacc:我认为工具链有点过时了,我认为它不能很好地与我的程序的其余部分配合使用用于在C++; 我想用C++解析一个文本文件。我知道文件的语法,从计算机科学的角度来看,我认为我没有任何问题。但是,我不知道如何在C++中实现解析器。我认为有很多可能性:,c++,parsing,C++,Parsing,flex/yacc:我认为工具链有点过时了,我认为它不能很好地与我的程序的其余部分配合使用 普通C:我可以将整个文件读入一个字符数组,并使用指针进行随机访问。问题是文本文件可能很大,我真的不想一直把它们存储在内存中 C++istreams:我认为这里的问题是,在解析文件的过程中,我当然需要某种前瞻性。如果一个表达式不匹配,那么我当然必须将我读到的字符放回流中。我认为,使用C++中的ungGH函数,这将变得相当丑陋。此外,由于表达式可能相当长,peek函数可能不适合我 使用boost:boost提
mmap()
。Beej在一个新地址重新上线,并提供了一个使用示例
Boost还提供了以独立于平台的方式使用上述功能的单一方法。我对它了解不多,因为我宁愿自己写这样的东西。我相信它有它的优点。Boost有一页关于它的文章
堆栈溢出有一个关于解析<代码> MAMP()/<代码> ED文件的问题。
你也可以考虑作为分析器生成器。
如果你给出了你想解析的最具挑战性的例子,这将是有帮助的。无论如何,Boost比RegEx更有一个名为“Spirit”的解析器库:更多的需求将有助于引导答案。你在说什么样的文本文件?逗号分隔值?一些编程语言?XML?你能举一个简单的例子吗?我不会说Flex/Bison链“过时”,更像是“稳定、知名和经过战斗考验”。对于#1,你应该在总结任何东西之前检查Flex和yacc。对于#3,您可以围绕istreams构建一个包装器,以提供合理高效且易于使用的前瞻性;C?--为什么还要提及?C++流?它们与解析有什么关系?--使用streambuf并复制到vector中,就可以得到随机访问迭代器。用C++你有两个现代选择:Booo::精神——与许多C++编译器一起工作,快速执行,编译速度慢;或者AXE——需要C++11编译器,很快将在boost许可下发布。我使用的是linux,我一定会研究POSIX部分,谢谢。