我目前正在编写自己的词法分析器(最终是一个解析器),到目前为止一切正常。我能识别我需要的一切,除了最近我遇到了一个小问题。当我输入一个标识符(如“character”)时,词法分析器输出一个标记 [ KEYWORD, "char"]
和另一个标记 [ IDENTIFIER, "acter"]
。我目前对输入进行词法分析的方式是在标识符之前查找关键字,因此像 int
这样对关键字和标识符都有效的东西首先被分配给关键字。但是当标识符在开头包含关键字时,它会将 ID
分成两部分,一部分用于关键字,另一部分用于 ID
。我需要它保留为 IDENTIFIER
。如果需要任何代码,我很乐意发布。
编辑:这是语法(还没有解析规则) 注意:它被缩短了,只是为了保持重点:我的关键字在标识符之前,它们具有优先权。
关键词:“如果” | “其他” | “同时” | “为” | “假” | “真实” | “打破” | “返回” | “诠释” | “漂浮” | “炭” | “字符串” | “ bool ” | “无效” | “空”;
标识符:[a-zA-Z_][a-zA-Z0-9_]*;
INT_LITERAL:[0-9]+;
FLOAT_LITERAL:[0-9]+ '.' [0-9]+
最佳答案
我假设关键字是标识符的一个子集。
您不应该依赖词法分析器来查找关键字。相反,您的词法分析器应该只贪婪地寻找标识符,即它应该匹配构成标识符的最长字符序列。
当它找到一个时,您应该自己检查标识符的文本是否是关键字之一。如果是,则返回一个 KEYWORD token ,否则返回一个 IDENTIFIER token 。
关于c - 词法分析器将标识符的一部分识别为关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50799660/