我正在研究'nandtotetris',在第10章中,你为编译器制作了一个标记器。本书建议编写一个hasMoreTokens例程并使用高级例程来获取下一个标记(如果hasMoreTokens返回true)和一个tokenType例程等。我正在使用python并且可以按行和字符读取。我可以通过逐个字符阅读来获取令牌,但是在我实际读取令牌之后我才能确定它,因此已经知道了tokenType将会返回什么...?任何人都可以解释书籍建议的基本原理吗?
感谢。这本书在这里:第12页http://www.cs.huji.ac.il/course/2002/nand2tet/docs/ch_10_compiler_I.pdf。
曾想过分成子串,每个子串都没有空格,但这似乎不对,因为你还是要回去处理'mary = 2 *(frank-1)'之类的东西
答案 0 :(得分:1)
我不打算阅读完整的PDF文件(虽然我确实浏览过它),但我想我可以猜到它是什么意思。
解析过程在逻辑上划分为一个tokenizer(aka lexical analyzer,aka lexer)和一个解析器。标记生成器逐个字符地检查源代码并返回标记。解析器读取令牌流并返回已解析的数据结构。
令牌化程序可以在解析器知道之前知道是否有另一个令牌。 hasMoreTokens
例程可以提前读取并查明是否有更多令牌可用。在实践中,一个好方法是让你的标记器只在可能的情况下查看每个字符一次。
我可能会让它一次跟踪两个令牌,最后两个被读取。第一个是解析器角度的“当前”令牌,第二个是“下一个”令牌。然后hasMoreTokens
例程告诉解析器当前该对的第二个是什么。如果令牌器总是知道下一个令牌是什么,那么它总能回答是否有另一个令牌可用的问题。