Compiler construction 表驱动lexer-保留关键字呢?

Compiler construction 表驱动lexer-保留关键字呢?,compiler-construction,grammar,lexer,lexical-analysis,formal-languages,Compiler Construction,Grammar,Lexer,Lexical Analysis,Formal Languages,这个问题源于我在CS网站上问的另一个问题 我试着在网上搜索各个大学的课程笔记,以便找到我所面临问题的答案 我必须为一个赋值实现一个自定义语言的编译器。这种语言包含一些原子符号,如英语字母表中的字母和数字。我设法找到了这些例子,它们非常简单。例如: 但是,这种语言还包含保留字,例如if和for 这就是我遇到问题的地方。假设lexer正在尝试读取字符串“if(expression)statement”。如果我使用类似的实现,它将错误地将If分类为标识符 因此,我的想法是实现一种“前瞻”机制,以便在l

这个问题源于我在CS网站上问的另一个问题

我试着在网上搜索各个大学的课程笔记,以便找到我所面临问题的答案

我必须为一个赋值实现一个自定义语言的编译器。这种语言包含一些原子符号,如英语字母表中的字母和数字。我设法找到了这些例子,它们非常简单。例如:

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

这就是我遇到问题的地方。假设lexer正在尝试读取字符串“if(expression)statement”。如果我使用类似的实现,它将错误地将If分类为标识符

因此,我的想法是实现一种“前瞻”机制,以便在lexer分类并将正在读取的内容发送给DFA之前,它能够做出明智、正确的决策

例如:lexer遇到i。由于i可以属于保留字(如果),lexer应该检查下一个字符。如果它是f,那么lexer应该确保它实际上不是以If开头的正常字符串,比如ifxyz

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

更新 这是为那些通过搜索来寻找解决方案的人准备的。 已经有一段时间了,我已经解决了这个问题,评论中链接的答案非常有用。我建议你去读一下

下面是我如何解决这个问题的:


开始(f)->f

F(o)->FO

FO(r)->FOR

对于(\)->标识符

此外,所有国家都有“法作为”财产。 原因:考虑你到达状态F没有进一步的输入。因此,您应该假设它是一个标识符(在大多数语言中)。
因此,F.lexAs将返回状态的正确解释,在本例中为标识符。

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

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

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

下面是一个示例DFA,它只解释
IF
ID
标记,并且只接受字符
a-z


如果您是通过搜索来这里的,那么回答可能也与此相关。我已经解决了这个问题,并且(如问题评论中所链接的)这正是我所寻求的解决方案。