【发布时间】:2018-11-20 19:37:54
【问题描述】:
我目前正在编写自己的词法分析器(最终是解析器),到目前为止一切正常。我能够识别出我需要的一切,除了最近我遇到了一个小问题。当我输入诸如“字符”之类的标识符时,词法分析器会输出一个标记[ KEYWORD, "char" ] 和另一个标记[ IDENTIFIER, "acter" ]。我目前对输入进行词法分析的方式是在标识符之前查找关键字,以便int 之类的东西对关键字有效,并且首先将标识符分配给关键字。但是当标识符在开头包含关键字时,它会将ID 分成两部分,一部分用于关键字,另一部分用于ID。我需要它保持为IDENTIFIER。如果需要任何代码,我很乐意发布。
编辑:这是语法(还没有解析规则) 注意:它被缩短了,只是为了保持重点:我的关键字在标识符之前,它们具有优先权。
关键词:“如果”| “其他” | “而” | “为” | “假” | “真” | “断” | “回归” | “整数” | “浮动” | "字符" | "字符串" | “布尔” | “空虚” | “空”;
标识符:[a-zA-Z_][a-zA-Z0-9_]*;
INT_LITERAL:[0-9]+;
FLOAT_LITERAL: [0-9]+ '.' [0-9]+
【问题讨论】:
-
让你的匹配变得贪婪,所以它总是尝试匹配尽可能多的字符
-
您可以考虑发布您的语法。假设您有一个将 [A-Za-z_][A-Za-z_0-9] 的任何序列定义为标识符的语法,那么您的词法分析器中可能有一个错误,您在其中收集标识符标记。