我正在编写我的第一个解析器,并且有几个问题需要考虑令牌生成器。
基本上,我的令牌生成器公开一个nextToken()应该返回下一个令牌的函数。这些令牌由令牌类型区分。我认为拥有以下令牌类型将是有意义的:
<,:=,(和等现在,您认为这有意义吗?
另外,我正在努力处理NUMBER令牌类型。您认为将其进一步拆分为NUMBER和FLOAT令牌类型更有意义吗?没有FLOAT令牌类型,如果我要解析浮点数,我将收到NUMBER(例如402),一个SYMBOL(。)后跟另一个NUMBER(例如203)。
最后,您认为令牌化程序在遇到a时返回更有意义-909吗?它应该返回第SYMBOL -一个,然后NUMBER 909返回还是立即返回NUMBER -909?
这取决于您的目标语言。
词法分析器背后的要点是返回标记,以便轻松为您的语言编写解析器。假设您的词法分析器NUMBER在看到与“[0-9]+”匹配的符号时返回。如果它看到一个非整数,例如“3.1415926”,它将返回NUMBER . NUMBER。虽然您可以在解析器中处理这个问题,但如果您的词法分析器正在执行跳过空格和注释的适当工作(因为它们与您的解析器无关),那么您最终可能会错误地解析诸如“123 /* comment / . \”之类的内容。 n /其他注释 */ 456" 作为浮点数。
至于词法“-[0-9]+”再次作为NUMBERvs MINUS NUMBER,这取决于你的目标语言,但我通常会选择,MINUS NUMBER否则你最终会词法“A = 1-2-3-4”SYMBOL = NUMBER NUMBER NUMBER NUMBER的SYMBOL = NUMBER MINUS NUMBER MINUS NUMBER MINUS NUMBER。
当我们讨论这个主题时,我强烈推荐《语言实现模式》一书,作者是ANTLR的作者 Terrance Parr 。