Table-Driven Lexers - 保留关键字呢?

Table-Driven Lexers - What about reserved keywords?

这个问题源于我在 CS 站点上提出的另一个问题。 Reference

我尝试搜索各个大学的在线课程笔记,以便找到我面临的问题的答案。

我必须为作业的自定义语言实现编译器。这种语言包含一些 atomic 符号,例如英文字母表中的字母和数字。我设法找到了这些示例,它们非常简单。例如:Go to Page 25

但是,该语言还包含保留字,例如iffor

这是我遇到问题的地方。假设词法分析器试图读取字符串“if (expression) statement”。如果我使用像 Page 4 这样的实现,它将错误地将 if 分类为标识符。

所以我的想法是实现一种“先行”机制,以便在词法分析器对正在读取的内容进行分类并将其发送给 DFA 之前,它可以做出明智、正确的决定。

例如:词法分析器遇到i。由于 i 可以属于保留字 (if),词法分析器应该检查 next 字符.如果它是 f 那么词法分析器应该确保它实际上不是一个恰好以 if 开头的普通字符串,比如 ifxyz.

我喜欢这个想法,除了我在网上看课程笔记没有找到任何类似的东西,这让我觉得也许我做错了什么。

更新!! 这是为那些通过搜索试图找到解决方案来到这里的人准备的。 已经有一段时间了,我实际上已经解决了这个问题,评论中链接的答案非常 很有帮助。我建议你去看看。

以下是我最终解决这个问题的方法:


START(f) -> F

F(o) -> FO

FO(r) -> FOR

FOR(_) -> IDENTIFIER

此外,所有州都有“Lex As”属性。 这样做的原因:假设您在没有进一步输入的情况下到达状态 F。因此,您应该假设它是一个标识符(在大多数语言中)。 因此,F.lexAs 将 return 状态的正确解释,在本例中为 IDENTIFIER。

您的前瞻示例本身确实就像一个 DFA。遗憾的是,除了将关键字硬编码到您正在使用的 DFA 中之外,没有简单的方法可以解决此问题。

对于 if 示例,我会创建一个名为 IF 的令牌类型,它与您的 ID 令牌类型不同。

现在,您必须更改 DFA 以接受 IF 令牌。如果我们处于起始状态并且我们读取 i DFA 不应该启动正常的 ID 路径,它应该沿着单独的路径走下去。

这是一个 DFA 示例,仅解释 IFID 标记,并且仅接受字符 a-z.