我正在编写自己的词法分析器(最终是一个解析器),到目前为止一切正常。我能够识别出我需要的一切,除了最近我遇到了一个小问题。当我输入诸如“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] +
答案 0 :(得分:2)
我认为关键字是标识符的子集。
您不应该依赖词法分析器来查找关键字。相反,你的词法分析者应该只贪婪地寻找标识符,即它应该与构成标识符的最长字符序列匹配。
当找到一个时,您应该检查自己是否标识符的文本是其中一个关键字。如果是,则返回KEYWORD标记,否则返回IDENTIFIER标记。