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

标签 c token keyword lexer

我目前正在编写自己的词法分析器(最终是一个解析器),到目前为止一切正常。我能识别我需要的一切,除了最近我遇到了一个小问题。当我输入一个标识符(如“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/

相关文章:

c - C编译中断

java - 使用 Java 提取逗号分隔的数字或单词列表

java - JWT 组件信息

angularjs - Django Rest Framework JWT : How to change the token expiration time when logged in

loops - 为什么 "break"结束 "loop"时不需要分号?

Python 命名参数是关键字?

由 c++ Mysql C API mysql_real_escape_string

c - 带终止和不带终止的两个不同 while 循环之间的区别?

c - MPI 意外输出

sql - SQLite3 中的 REFERENCES 关键字