解析时我应该将源文件保存在内存中吗?

时间:2017-08-09 02:08:23

标签: c parsing

我正在编写解释器的前端部分,我最初不喜欢将所有源文件转储到内存中然后直接引用该文本的想法。因此,tokenizer从char缓冲区读取并构建令牌流。

然而,我已经达到了解析方面的问题,它让我感到害怕,因为我想要输出错误和警告来显示格式错误的源代码行。我想我可以在列表中添加列号,但是通过错误消息就像通过电话获取方向:"它位于文件X中,位于Y行,Z列,紧邻大括号旁边,你知道那一个。如果你打了分号,你已经走了很远。"

我似乎把自己置于一种我想吃蛋糕的地方。我想要好消息,但我不想记忆。

有什么我想念的吗?或者正在将内容加载到内存中?

2 个答案:

答案 0 :(得分:2)

当向用户报告时出现错误,报告它需要多长时间(以毫秒为单位)。

我会将您的标记化流保存在内存中以保持您的解释器快速。 (实际上,你应该切换到一个线程解释器,甚至是一个糟糕的一次通过编译器来提高执行率。)

当您遇到错误时,请转到磁盘,获取感兴趣的行,然后将其显示给用户。如果他没有犯任何错误,那么你将花费零。如果他犯了少量错误,那可能效率不高,但用户不会知道。如果他犯了大量错误,那么包含错误的文件的文件内容将由操作系统读取到其本地缓存中,这可能比您的程序更大,因此访问将比保留源更有效完全在磁盘上。

答案 1 :(得分:1)

更好的主意:mmap首先是您的来源,如果可以的话。如果你正在从管道或其他东西上读书,那就回去啜饮整个文件。

解析后,可能想要调用madvise(MADV_DONTNEED)(但,如果它原来是mmap)建议内核删除它来自缓存(但仍然保持可用于错误)...但这可能不是必需的,甚至可能不是一个好主意,这取决于您的编译器设计(例如标识符仍然指向,或者它们被固定到单一,分开,分配)。