Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于在C++; 我想用C++解析一个文本文件。我知道文件的语法,从计算机科学的角度来看,我认为我没有任何问题。但是,我不知道如何在C++中实现解析器。我认为有很多可能性:_C++_Parsing - Fatal编程技术网

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

用于在C++; 我想用C++解析一个文本文件。我知道文件的语法,从计算机科学的角度来看,我认为我没有任何问题。但是,我不知道如何在C++中实现解析器。我认为有很多可能性:,c++,parsing,C++,Parsing,flex/yacc:我认为工具链有点过时了,我认为它不能很好地与我的程序的其余部分配合使用 普通C:我可以将整个文件读入一个字符数组,并使用指针进行随机访问。问题是文本文件可能很大,我真的不想一直把它们存储在内存中 C++istreams:我认为这里的问题是,在解析文件的过程中,我当然需要某种前瞻性。如果一个表达式不匹配,那么我当然必须将我读到的字符放回流中。我认为,使用C++中的ungGH函数,这将变得相当丑陋。此外,由于表达式可能相当长,peek函数可能不适合我 使用boost:boost提

flex/yacc:我认为工具链有点过时了,我认为它不能很好地与我的程序的其余部分配合使用

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

  • C++istreams:我认为这里的问题是,在解析文件的过程中,我当然需要某种前瞻性。如果一个表达式不匹配,那么我当然必须将我读到的字符放回流中。我认为,使用C++中的ungGH函数,这将变得相当丑陋。此外,由于表达式可能相当长,peek函数可能不适合我

  • 使用boost:boost提供了正则表达式,这非常适合识别标记,但就我的研究而言,在istream的上下文中匹配正则表达式并使用标记是不可能的

  • 不久前我还在java中使用了javacc,我不得不说我对它印象深刻。但是我不认为C++中有类似的东西,是吗? 如果在该领域有经验的人能为我指出正确的方向,我将不胜感激。

    如果这是真的:

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

    你应该调查一下

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

    POSIX提供了
    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部分,谢谢。