要处理诸如+
,*
,if
和import
之类的运算符和关键字,应将它们写为词法分析器规则,还是直接写成语法?两种方式之间是否存在明显的性能差异?是否取决于情况?在决定要在词法分析器中运行什么以及在解析时剩下什么时,我应该考虑什么?
答案 0 :(得分:0)
Lexer和解析器即使使用相同的方法,也具有不同的用途。词法分析器通过扫描一定范围的字符并分配一个数字(令牌类型)来对字符输入进行分类。该词法分析器可以跳过/忽略某些字符序列,并可以使用高级文本匹配技术,例如字符范围和Unicode字符类。也可以通过按特定顺序对令牌规则进行排序来微调匹配过程。
在解析器中什么也做不了,解析器需要令牌来构造句子,这些句子是语法表示语言的一部分。即使您可以在解析器中定义char文字(然后称为隐式标记),我也不建议这样做。原因是您无法以任何方式控制令牌,它们是用任意名称创建的(例如,您无法在侦听器中检查它们),并且它们可能以其他方式与其他令牌冲突解决。
因此,作为一般规则:将始终属于在一起的字符序列定义为词法分析器中的单个标记,这些字符序列由某些定界符(例如空格)分隔开,这是典型的示例(关键字,字符串,数字,运算符等)。由于分隔符(如空格)可以隐藏甚至跳过,而且永远不会到达解析器,因此与解析器相比,处理标记序列变得容易得多。