ANTLR LEXER RULE 有两个规则,一个将接受包括符号在内的所有字符,另一个将仅接受字符

问题描述 投票:0回答:1

ANTLR LEXER RULE中是否可以有两个规则,一个规则将接受所有字符,包括所有符号(如

(
)
_
等),另一个将仅接受字符
a
z

如下所示:

String: ('a'..'z'|'A'..'Z')*;
EVERYTHING:(.)*;   
antlr grammar antlr3 lexical-analysis antlrworks
1个回答
1
投票

是的,这是可能的。

这就是 ANTLR 词法分析器决定使用哪个规则的方式:

  • 无论哪个规则能够匹配输入的最长子序列(从输入中的当前位置开始)
  • 如果有更多规则可以匹配该子序列(即平局),则第一个规则(如语法文件中定义)获胜

因此,在您的情况下,对于仅字母输入,两个规则都会匹配它,但由于

String
在语法中更靠前,因此将使用它。在非 alpha 输入的情况下,
EVERYTHING
规则将能够匹配更长的子序列,因此将被使用。

但请注意,正如所写,您的

EVERYTHING
规则甚至匹配空格和换行符,因此在这种特定情况下,仅当整个输入只是字母字符而没有其他字符时,才会使用
String
规则;在任何一种情况下,整个输入都将作为单个标记进行匹配。所以在真正的语法中,
EVERTYHING
规则可能会略有不同。

© www.soinside.com 2019 - 2024. All rights reserved.