Parsing 运算符和关键字应该放在lexer还是解析器中?

Parsing 运算符和关键字应该放在lexer还是解析器中?,parsing,antlr,antlr4,grammar,lexer,Parsing,Antlr,Antlr4,Grammar,Lexer,对于处理运算符符号和关键字,如+、*、if、和import,它们应该作为lexer规则编写,还是直接写入语法?在这两种情况下是否存在显著的性能差异?这取决于情况吗?当我决定在Listar中运行什么,以及什么时候去解析时,我应该考虑什么? < P> Lexer和解析器,即使它们使用相同的方法,也有不同的用途。lexer通过扫描一系列字符并分配一个数字(令牌类型)对字符输入进行分类。lexer可以跳过/忽略某些字符序列,并可以使用高级文本匹配技术,如字符范围和Unicode字符类。还可以通过按特定顺

对于处理运算符符号和关键字,如
+
*
if
、和
import
,它们应该作为lexer规则编写,还是直接写入语法?在这两种情况下是否存在显著的性能差异?这取决于情况吗?当我决定在Listar中运行什么,以及什么时候去解析时,我应该考虑什么?

< P> Lexer和解析器,即使它们使用相同的方法,也有不同的用途。lexer通过扫描一系列字符并分配一个数字(令牌类型)对字符输入进行分类。lexer可以跳过/忽略某些字符序列,并可以使用高级文本匹配技术,如字符范围和Unicode字符类。还可以通过按特定顺序排列令牌规则来微调匹配过程

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

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