我见过一些语言会吃一个令牌,然后解析令牌,然后当它们需要在解析时检查下一个令牌时,它们会从lexer请求它。
因此,您有了if (x == 3) / lex,再次检查它是什么-- if,lex,并确保它是a (在本例中,解析一个请求3的表达式,直到它解析完一个表达式,然后再解析一个结束的括号。
另一种选择是将此输入流作为keyword, symbol, identifier, equality, number, symbol,然后将该令牌列表提供给解析器,解析器将将其解析为AST。
这两种技术的优缺点是什么?
发布于 2016-10-15 22:55:11
对于大多数语法来说,是否将整个输入作为第一次传递并不重要,然后在解析传递期间从列表中获取令牌,或者根据需要从列表中获取标记。第二种方法避免了内存中令牌列表的需要,第一种方法意味着您可以以更快的速度解析几次,这可能需要在解释器中这样做。
但是,如果语法需要一个以上的前瞻性标记,或者不是左-右,那么您可能需要更多的lex。虽然自然语言有一些奇怪的解析规则(“时间飞快如箭,果蝇如香蕉”),但计算机语言通常被设计成可以用一个简单的递归下降解析器来解析,并带有一个前瞻性标记。
https://stackoverflow.com/questions/40064998
复制相似问题