Table-Driven Lexers - 保留关键字呢?
Table-Driven Lexers - What about reserved keywords?
这个问题源于我在 CS 站点上提出的另一个问题。 Reference
我尝试搜索各个大学的在线课程笔记,以便找到我面临的问题的答案。
我必须为作业的自定义语言实现编译器。这种语言包含一些 atomic 符号,例如英文字母表中的字母和数字。我设法找到了这些示例,它们非常简单。例如:Go to Page 25
但是,该语言还包含保留字,例如if和for。
这是我遇到问题的地方。假设词法分析器试图读取字符串“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 示例,仅解释 IF
和 ID
标记,并且仅接受字符 a-z
.
这个问题源于我在 CS 站点上提出的另一个问题。 Reference
我尝试搜索各个大学的在线课程笔记,以便找到我面临的问题的答案。
我必须为作业的自定义语言实现编译器。这种语言包含一些 atomic 符号,例如英文字母表中的字母和数字。我设法找到了这些示例,它们非常简单。例如:Go to Page 25
但是,该语言还包含保留字,例如if和for。
这是我遇到问题的地方。假设词法分析器试图读取字符串“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 示例,仅解释 IF
和 ID
标记,并且仅接受字符 a-z
.