编译器如何知道是否有'更多的令牌',除非它已经读取了下一个令牌?
我正在使用'nandtotetris',并在第10章中为编译器创建了一个标记器。本书建议编写hasMoreTokens例程并使用预先例程获取下一个标记(如果hasMoreTokens返回true)以及一个tokenType例程等。我使用python,并且可以按行和按字符读取。我可以通过阅读字符来获得令牌,但是我只能确定它是否已经读取了令牌,因此已经知道tokenType将会返回什么。任何人都可以解释书籍建议的基本原理吗?编译器如何知道是否有'更多的令牌',除非它已经读取了下一个令牌?
谢谢。这本书在这里:http://www.cs.huji.ac.il/course/2002/nand2tet/docs/ch_10_compiler_I.pdf在第12页。
曾想过分解成每个没有空白的子字符串,但这看起来不正确,因为你仍然必须回去处理像'mary = 2 *(frank-1)'等
我不打算通读整个PDF(尽管我已经浏览了它),但我想我可以猜测它的意图是什么。
解析过程在逻辑上被划分为一个标记器(又名词法分析器,又名词法分析器)和一个解析器。标记器逐字检查源代码并返回标记。解析器读取一串令牌并返回已解析的数据结构。
标记器可以知道在解析器知道它之前是否有另一个标记。例程hasMoreTokens
可以提前读取,并确定是否有更多的令牌可用。在实践中,一个很好的方法就是让tokenizer只在可能的情况下查看每个字符。
我可能会一次跟踪两个令牌,最后两个是被读取的。其中第一个是来自解析器视角的“当前”令牌,第二个是“下一个”令牌。例程hasMoreTokens
然后告诉解析器这个对中的第二个是什么。如果标记器总是知道下一个标记是什么,那么它总是可以回答是否有另一个标记可用的问题。
听起来没错,除了书中还建议先使用tokenizer,然后继续解析输出... – user3381263
你可以这样做,但没有太多的优势。从概念上讲,标记器读取一串字符并产生一个标记流,然后解析器读取标记流并产生一个树结构。但实际上,标记化和解析操作通常是交替的。标记器通常只是解析器在需要另一个标记时调用的函数。但是,如果您发现它更容易,请首先解析所有令牌。 –
具体取决于'hasMoreTokens'在下列数据作为标记无效的情况下应该做些什么。如果它被允许返回true,并且如果你正在逐个字符地阅读,那么原则上你只需要知道为了从'hasMoreTokens'返回就有另一个字符。看到一个引用足以说有另一个令牌,你可以延迟阅读整个25MB的字符串直到解析器要求它:-)但是,我不知道这个特定的文本预计什么,所以我不知道这是一个回答。 –