词法分析器急切地将整个输入字符串转换为令牌向量。一旦完成,向量被提供给解析器,解析器将其转换为树形结构。这是实现最简单的解决方案,但由于所有令牌都存储在内存中,它浪费了大量空间。
每当词法分析器找到一个令牌时,它会调用解析器上的函数,传递当前令牌。根据我的经验,只有像LALR解析器这样自然可以作为状态机实现的解析器才能使用此方法。相比之下,我认为对于递归下降解析器根本行不通。
每当解析器需要一个令牌时,它会请求词法分析器提供下一个令牌。由于C#具有“yield”关键字,因此这非常容易实现,但在没有此功能的C++中实现起来相当困难。
词法分析器和解析器通过异步队列进行通信。这通常称为“生产者/消费者”,它应该大大简化词法分析器和解析器之间的通信。它是否在多核方面优于其他解决方案?或者词法分析过于琐碎了吗?
yield return
语句,只有一个返回下一个标记的函数。它在解析器类的字段中保存当前语句的位置(技术上它保存当前和前一个标记,并返回前一个标记,所以我有向前看的能力,但这是细节)。 - Blindyyield return
语句。还有其他等效的选择,比如词法分析器生成一个iterator<token>
,在operator++
中获取下一个标记...但这又是相同的方法:解析器以某种方式请求下一个标记。 - David Rodríguez - dribeasyield
关键字。您可以假装一直拥有控制流,并使用for循环迭代字符串并yield return标记。在C++中,实现这两个不同的函数需要不同的“心态”。如果您认为在C++中实现迭代器很容易,那么您可能已经多次完成了此操作,并且可能从未在其他语言中使用过yield
,以了解实际上实现迭代器有多容易。 - fredoverflow