在`lexer文件中包含标记的地方,在语义或性能上有什么区别吗?例如:
EQUAL : '=' // Equal, also var:=val which is unsupported
NAMED_ARGUMENT : ':='; // often used when calling custom Macro/Function
Vs。
NAMED_ARGUMENT : ':='; // often used when calling custom Macro/Function
EQUAL : '=' // Equal, also var:=val which is unsupported
在本例中,顺序无关紧要。如果Lexer找到:=
,那么它将生成NAMED_EQUAL
令牌(因为它是比=
更长的字符序列(。
Lexer将更喜欢与输入字符的最长序列相匹配的规则。
唯一重要的时间顺序是如果多个Lexer规则匹配相同长度的字符序列,然后Lexer将为语法中的第一个Lexer规则生成一个令牌(例如,请确保将关键字放在ID
规则之前,因为很可能您的关键字也会匹配ID
规则,但如果出现在ID
之前,则会选择关键字
--编辑--
所有这些。。。正如@rici在他的评论中提到的那样,在这个特定的案例中,秩序并不重要,原因完全不同。
Lexer试图匹配文件开头的输入(或最后识别的令牌后面的字符(。
我是这样想的:Lexer选择了一个角色,然后排除了所有不能以这个角色开头的Lexer规则。然后查看该字符和下一个字符的序列,并排除所有不能以该字符序列开头的Lexer规则。如果重复这样做,直到它有一个无法匹配任何Lexer规则的字符序列。在这一点上,我们知道直到(但不包括(该角色的所有内容都必须符合一个或多个Lexer规则。如果只有一个规则,那么它就是生成的令牌如果有多个Lexer规则匹配,则选择第一个规则。
在您的情况下,":"会立即排除EQUAL
令牌的匹配(不能以":"开头(,但仍有可能与NAMED_EQUAL
令牌匹配。如果下一个字符是"=",那么它知道它可以匹配NAMED_EQUAL
规则(但也许你有其他规则可以以":="开头,所以它会查看下一个字符串(我们猜它是一个空格(":+"does not match the
NAMED_EQUALrule, and for this example, doesn't match ANY rules. Now it backs up and says ":+" matched the
NAMED_EQULSrule (and no others), so it creates a
NAMED_EQUALS`令牌,并从无法匹配的空格开始重新启动整个过程。