【问题标题】:Lexer recognizes parts of an identifier as a keywordLexer 将标识符的一部分识别为关键字
【发布时间】: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] 的任何序列定义为标识符的语法,那么您的词法分析器中可能有一个错误,您在其中收集标识符标记。

标签: c token keyword lexer


【解决方案1】:

我假设关键字是标识符的子集。

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

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

【讨论】:

  • 啊,我现在明白了。非常感谢,这更有意义。
猜你喜欢
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2019-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多