在Lexer中放置代币重要吗

  • 本文关键字:Lexer parsing antlr antlr4
  • 更新时间 :
  • 英文 :


在`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 theNAMED_EQUALrule, and for this example, doesn't match ANY rules. Now it backs up and says ":+" matched theNAMED_EQULSrule (and no others), so it creates aNAMED_EQUALS`令牌,并从无法匹配的空格开始重新启动整个过程。

相关内容

  • 没有找到相关文章

最新更新