"concurrently" 词法分析和解析 vs 词法分析然后解析?

"concurrently" lexing and parsing vs lexing then parsing?

我见过一些语言会吃掉一个令牌,然后解析令牌,然后当他们需要在解析时检查下一个令牌时,他们会从词法分析器请求它。

所以你有 if (x == 3) 你的 lex,检查它在这种情况下是什么 if,再次 lex 并确保它是 (,解析一个在这种情况下请求 3 的表达式,直到它完成解析一个表达式, 然后你 lex 并期待一个右括号。

另一种选择是将此输入流定义为 keyword, symbol, identifier, equality, number, symbol,然后将该标记列表提供给解析器,解析器会将其解析为 AST。

这两个技巧的pros/cons是什么?

对于大多数语法,无论您是将整个输入作为第一遍 lex 放入记号列表,然后在解析过程中从列表中取出记号,还是按需进行 lex,都无关紧要。第二种方法避免了对内存中标记列表的需要,第一种方法意味着您可以更快地解析几倍,您可能希望在解释器中执行此操作。

但是,如果语法需要一个以上的先行标记或不是左右标记,那么您可能需要进行更多的词法分析。虽然自然语言有一些奇怪的解析规则 ("time flies like an arrow, fruit flies like bananas"),但计算机语言通常被设计为可使用具有一个先行标记的简单递归下降解析器进行解析。