ANTLR LEXER RULE中是否可以有两个规则,一个规则将接受所有字符,包括所有符号(如
(
,)
,_
等),另一个将仅接受字符a
到z
?
如下所示:
String: ('a'..'z'|'A'..'Z')*;
EVERYTHING:(.)*;
是的,这是可能的。
这就是 ANTLR 词法分析器决定使用哪个规则的方式:
因此,在您的情况下,对于仅字母输入,两个规则都会匹配它,但由于
String
在语法中更靠前,因此将使用它。在非 alpha 输入的情况下,EVERYTHING
规则将能够匹配更长的子序列,因此将被使用。
但请注意,正如所写,您的
EVERYTHING
规则甚至匹配空格和换行符,因此在这种特定情况下,仅当整个输入只是字母字符而没有其他字符时,才会使用 String
规则;在任何一种情况下,整个输入都将作为单个标记进行匹配。所以在真正的语法中,EVERTYHING
规则可能会略有不同。