词法分析器将标识符的一部分识别为关键字

Lexer recognizes parts of an identifier as a keyword

我目前正在编写自己的词法分析器(最终是一个解析器),到目前为止一切正常。我能识别我需要的一切,除了最近我遇到了一个小问题。当我输入一个标识符,如 "character" 时,词法分析器输出一个标记 [ KEYWORD, "char" ] 和另一个标记 [ IDENTIFIER, "acter" ]。我目前对输入进行词法分析的方式是在标识符之前查找关键字,因此像 int 这样的东西对关键字和标识符都有效,它首先被分配给关键字。但是当标识符在开头包含关键字时,它会将 ID 分成两部分,一部分用于关键字,另一部分用于 ID。我需要它保持 IDENTIFIER。如果需要任何代码,我很乐意 post 它。

编辑:这是语法(还没有解析规则) 注意:它被缩短了,只是为了保持重点:我的关键字在标识符之前,它们具有优先级。

关键词:"if" | "else" | "while" | "for" | "false" | "true" | "break" | "return" | "int" | "float" | "char" | "string" | "bool" | "void" | "null";

标识符:[a-zA-Z_][a-zA-Z0-9_]*;

INT_LITERAL: [0-9]+;

FLOAT_LITERAL: [0-9]+ '.' [0-9]+

我假设关键字是标识符的一个子集。

您不应依赖词法分析器来查找关键字。相反,你的词法分析器应该只贪婪地寻找标识符,即它应该匹配构成标识符的最长字符序列。

当它找到一个时,您应该自己检查标识符的文本是否是关键字之一。如果是,return 一个 KEYWORD 标记,否则 return 一个 IDENTIFIER 标记。