我想第一次使用C#编写编译器而且我不知何故失去了关于缓冲的方法!我的参考是编译器,原理,技术和工具,,它说:
由于处理字符所花费的时间和 在此期间必须处理的大量字符 编译大型源程序,专门缓冲 已经开发出减少开销量的技术 需要处理单个输入字符。一个重要的方案 涉及两个交替重新加载的缓冲区,每个缓冲区都是 相同大小N,N通常是磁盘块的大小,例如4096 字节。使用一个系统读取命令,我们可以将N个字符读入a 缓冲区,而不是每个字符使用一个系统调用。如果少于 N个字符保留在输入文件中,然后是特殊字符, 由eof表示,标记源文件的结尾并且是不同的 从源程序的任何可能的角色。
并且在本书中也说我们在每个缓冲区的末尾加上 eof 来实现我们到达缓冲区的末尾。它有两个指针前进和 lexemBegine 指向缓冲区中的lexeme! 我的问题是我不知道如何创建这个缓冲区?我应该在sourceBuffer类中创建大小为N的数组或缓冲区,然后如何从StreamReader读取文件并将源文件的N个字符放入数组? 如果我从源文件中读取字符会有什么问题?
答案 0 :(得分:2)
似乎你从1986年开始参考上一版的“编译器:原理,技术和工具”。(但即使在那个时候,引用的部分已经过时了。)
在像C#这样的现代编程语言中(或更准确地说,在其I / O库中),已经实现了这种缓冲(以强大,经过测试的高性能方式)。
只需使用StreamReader
即可完成所有这些工作。然后只读字符,直到找到完整的令牌,然后按照这本优秀书中的描述处理你的令牌。