【问题标题】:Should a Lexer return a list of tokens or a token on the flyLexer 是否应该即时返回令牌列表或令牌
【发布时间】:2021-09-08 00:38:26
【问题描述】:

我正在为一个项目实施 Lexer,但对它应该如何将令牌返回给解析器感到困惑。词法分析器是否应该在声明时急切地准备一个令牌列表以提供给解析器,或者解析器是否应该调用一个函数来懒惰地即时返回下一个令牌?还有,像 lex/flex 这样的工具是怎么做的呢?

【问题讨论】:

  • 任何一种方式都有优点。不过,大多数编译器(我熟悉的)都会根据需要请求令牌 - 这允许更简单的错误报告,因为令牌不需要存储源代码位置信息等等。

标签: compiler-construction lexer


【解决方案1】:

(f)lex 生成的扫描器被设计为每次调用时生成一个令牌,这与所有其他常用的扫描器生成器几乎相同。经验表明,这是最容易使用的界面。它还最大限度地减少了不必要的动态内存管理。

但是,(f)lex 生成的扫描仪不限于此模型。规则操作不必返回任何内容。它可以将令牌推送到令牌列表的末尾,或者调用增量令牌消费者(“推送”解析器)或只是将令牌放在地板上(就像通常使用空白令牌所做的那样)。

所以 (f)lex 不会限制可能性。但它没有提供支持累积令牌数组所需的内存管理的功能。如果由于某种原因您发现有必要使用这样的数组,那么您有责任实现它。

解析器需要令牌数组的情况并不常见,部分原因是在许多语言中,有时令牌化取决于解析器的状态(所谓的“词法反馈”)。但这并不是未知数。例如,GCC c++ 编译器使用令牌数组来促进预处理和简化前瞻和回退的频繁使用。

但是对于一个介绍性的解析项目,我肯定会建议使用通用接口(按需词法分析)。确实,我建议从 flex 或同等工具开始,因为在学习如何实现之前学习如何使用词法分析器会更有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2023-02-02
    • 2019-01-21
    相关资源
    最近更新 更多