运算符和关键字应该放在词法分析器还是解析器中?

Should operators and keywords be put in the lexer or the parser?

对于像+*ifimport这样的运算符号和关键字的处理,是应该写成词法规则,还是直接写成写入语法?这两种方式是否有任何显着的性能差异?这取决于情况吗?在决定通过词法分析器 运行 什么以及将什么留给解析时时,我应该考虑什么?

词法分析器和解析器,即使它们使用相同的方法,也有不同的目的。词法分析器通过扫描一系列字符并为其分配一个数字(标记类型)来对字符输入进行分类。词法分析器可以 skip/ignore 某些字符序列,并且可以使用高级文本匹配技术,如字符范围和 Unicode 字符 类。也可以通过按特定顺序对令牌规则进行排序来微调匹配过程。

解析器中无法完成的所有操作都采用标记来构造句子,这些句子是语法所表示的语言的一部分。即使您可以在解析器中定义 char 文字(然后称为隐式标记),我也不建议这样做。原因是您无法以任何方式控制令牌,它们是用任意名称创建的(因此您无法在侦听器中检查它们,例如)并且它们可能以您无法做到的方式与其他令牌发生冲突解决。

因此,作为一般规则:定义始终属于一起的字符序列,由某些定界符(如空格)分隔,作为词法分析器中的单个标记(关键字、字符串、数字、运算符等是典型示例)。因为定界符(如空格)可以被隐藏甚至跳过并且永远不会到达解析器,所以在解析器中处理标记序列变得容易得多。