一个词法分析器需要提供哪些功能?

3
我正在制作一个词法分析器,不要告诉我不要这样做,因为我已经完成了大部分内容。目前,它只能生成一个令牌数组。
我想知道,词法分析器需要提供哪些功能以及每个功能的简要说明。
我将接受最完整的列表。
例如:
next:消耗当前令牌并返回它
此外,词法分析器是否应该具有expect函数,还是解释器应该实现它?
顺便说一下,词法分析器构造函数接受一个字符串作为参数,并对其进行词法分析,将所有令牌存储在“tokens”变量中。
语言是javascript,所以我不能重载运算符。

http://en.wikipedia.org/wiki/Lexical_analysis - Brian Rasmussen
3个回答

6

根据我的经验,您需要:

  • nextToken — 推进输入并获取下一个token。
  • curToken — 返回当前token;不移动
  • curValue — 像STRING和NUMBER这样的token有值;像SEMICOLON这样的token没有值
  • sourcePos — 返回当前token第一个字符的源位置(行号,字符位置)

编辑 — 还有:

  • prefetch — 通过获取第一个token来初始化词法分析器。

此外,对于某些语言,您可能希望预先查看2个或更多token。然后,您会想要对普通的curToken进行变化,以便您可以在token流上查看更大的“窗口”。但对于大多数语言来说,这并不是非常必要的。

再次编辑 — 也许我不应该告诉你不去编写它们,因为它们基本上是最有趣的事情了。在javascript中,你不能太疯狂,但在像Erlang这样的语言中,你可以使你的词法分析器像“token泵”一样工作,使它生成一个token流,发送到一个单独的解析器进程中。


我对你的样例函数大多数都是同意的,除了这两个:1. “像STRING和NUMBER这样的标记有值; 像SEMICOLON这样的标记没有值”:这是真的,但我不认为这是词法分析器的工作来找出这些值。特别是在静态类型语言中,您无法从Token对象返回不同类型的'value'。我认为这是语义分析器的工作,它在解析器和词法分析器之上工作(value = semantics),或者如果需要将令牌转换为AST中的文本常量节点,则是解析器的工作。虽然我可以看到一些好处:避免扫描词元两次。 - SasQ
  1. prefetch: 当输入缓冲区中没有内容可供预取时,这个函数应该抛出错误吗?如果是,那么如果空源是一个有效的程序怎么办?预取会导致错误。我认为最好在nextToken无法从输入缓冲区获取更多内容时返回错误,因为当解析器期望更多文本而没有时(文件过早结束),这是一个错误,类似于OP提到的expect
- SasQ

3

通过编写一个使用您的词法分析器的程序,并实现您最终需要的函数,您应该能够编译出一个全面的列表。


0

再考虑一下您所提出的问题:“词法分析器需要提供哪些功能”

“需要”什么当然取决于需要什么,而不是所需要的。如果您能解释一下自己的需求,我们可能会能够给您更好的帮助。但是,我们试着回答一下:

一个最基本的词法分析器只需要一个函数,该函数以字符串为参数并返回字符串列表(或者如果您想要更为高级且延迟的话,返回字符串迭代器)。这足以满足许多用例,因此这就是一个词法分析器“需要”的。

一个更详细的词法分析器可以返回比字符串更复杂的对象,其中包含有关每个标记的进一步信息(例如,在原始字符串中的位置,以便您可以告诉那些代码存在语法错误的可怜程序员应该看哪里)。您可以想出很多元数据来添加到其中,除了行号之外,但再次强调,这完全取决于您的需求。


但这是一个合理的问题,如果想要为词法分析器设计一个接口,以使其准备好满足不同用户需求并使其易于使用。对于词法分析器,有一些常见的使用情况,如果在设计中缺失了它们,则可能会产生不良影响。将其视为有关词法分析器通常“设计模式”的问题。 - SasQ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接