我正在为玩具语言编写玩具编译器,假设它具有 JavaScript 语法。
假设源文件是:
var val = 123;
我的简单编译器将包含一个 Tokenizer 和一个 Parser(目前)。
Tokenizer 是否应该返回整个语言关键字,例如,var
还是逐个字母 ( v
, a
, r
) ?
迟早我将不得不识别关键字,文字等,我想知道这种工作的地方在哪里?
我正在为玩具语言编写玩具编译器,假设它具有 JavaScript 语法。
假设源文件是:
var val = 123;
我的简单编译器将包含一个 Tokenizer 和一个 Parser(目前)。
Tokenizer 是否应该返回整个语言关键字,例如,var
还是逐个字母 ( v
, a
, r
) ?
迟早我将不得不识别关键字,文字等,我想知道这种工作的地方在哪里?
标记器的全部意义在于获取您的输入流(字符)并为您提供可用于语法分析的标记。
因此,您会期望标记器为您提供以下内容:
T_KEYWORD_VAR
T_VARIABLE(val)
T_KEYWORD_EQUALS
T_INTEGER(123)
T_KEYWORD_SEMICOLON
标记器通常应该已经返回整个关键字(= tokens)。
这样做没有任何缺点:一旦您的分词器确定它是语言关键字(而不是数字或类似关键字),您为什么要通过将您已经成功检测到的内容分成几部分来“弱化”此信息;)
所以更笼统地说:不要犹豫,让标记器输出尽可能大的构建块——只要你不给它们任何意义,这应该留给解析器。