我正在做一个词法分析器,不要告诉我不要做,因为我已经做了大部分。
目前它制作了一系列令牌,仅此而已。
我想知道词法分析器需要提供哪些功能,以及每个功能需要做什么的简要说明。
我会接受最完整的清单。
一个示例函数是:
next : 消费当前令牌并返回
此外,词法分析器应该具有该expect
功能还是解释器应该实现它?
顺便说一句,词法分析器构造函数接受一个字符串作为参数,并进行词法分析并将所有标记存储在“tokens”变量中。
语言是javascript,所以我不能重载运算符。
我正在做一个词法分析器,不要告诉我不要做,因为我已经做了大部分。
目前它制作了一系列令牌,仅此而已。
我想知道词法分析器需要提供哪些功能,以及每个功能需要做什么的简要说明。
我会接受最完整的清单。
一个示例函数是:
next : 消费当前令牌并返回
此外,词法分析器应该具有该expect
功能还是解释器应该实现它?
顺便说一句,词法分析器构造函数接受一个字符串作为参数,并进行词法分析并将所有标记存储在“tokens”变量中。
语言是javascript,所以我不能重载运算符。
根据我的经验,您需要:
nextToken
— 在输入中前进并获得下一个标记。curToken
— 返回当前令牌;不要动curValue
— 像 STRING 和 NUMBER 这样的标记有值;像分号这样的标记不sourcePos
— 返回当前标记的第一个字符的源位置(行号、字符位置)编辑——哦还有:
prefetch
— 通过获取第一个标记来初始化词法分析器。此外,对于某些语言,您可能需要 2 个或更多的前瞻标记。然后你会想要一个简单的变体,curToken
这样你就可以在令牌流上看到一个更大的“窗口”。然而,对于大多数语言来说,这并不是必需的。
再次编辑——我也不会告诉你不要写,因为它们基本上是有史以来最有趣的东西。在javascript中你不能太疯狂,但是在像Erlang这样的语言中,你可以让你的词法分析器像一个“令牌泵”一样通过生成一个令牌流来发送到一个单独的解析器进程。
您应该能够通过编写一个使用您的词法分析器的程序并实现您最终需要的功能来编译一个完整的列表。
再想想你在问什么:“词法分析器需要提供什么功能”
它“需要”什么当然取决于你需要什么,而不是它需要什么。如果您解释自己的需求,我们可能会为您提供更好的帮助。但是,无论如何,这是一个镜头:
一个最小的将由一个函数组成,该函数接受一个字符串作为参数并返回一个字符串列表(或者如果你想要花哨和延迟的话,可以使用一个迭代器)。这对于许多用例来说已经足够了,因此是词法分析器“需要”的。
一个更具描述性的对象可以返回比字符串更复杂的对象,包含有关每个标记的更多信息(例如它在原始字符串中的位置,这样你就可以告诉可怜的程序员他的代码中有语法错误他在哪里应该看)。除了行号之外,您可能会想出许多要添加的元数据,但这一切都取决于您的需求。