Lexer将标识符的一部分识别为关键字

时间:2018-06-11 14:06:22

标签: c token keyword lexer

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

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

关键词:“if”|     “别的”|     “而”|     “为”|     “假”|     “真实”|     “休息”|     “回归”|     “int”|     “漂浮”|     “char”|     “string”|     “bool”|     “无效”|     “空”;

IDENTIFIER:[a-zA-Z _] [a-zA-Z0-9 _] *;

INT_LITERAL:[0-9] +;

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

1 个答案:

答案 0 :(得分:2)

我认为关键字是标识符的子集。

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

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