ANTLR Reference Guide关于括号的说明如下:
另一方面,我有以下语法:
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
fragment DIGIT : [0-9] ;
WORD : (LOWERCASE | UPPERCASE | DIGIT )+;
如果我运行字符串“ asd90”,则将其作为单词匹配,如下所示:
>java org.antlr.v4.gui.TestRig Myg myg -tokens
asd90
[@0,0:4='asd90',<WORD>,1:0]
[@1,5:6='\r\n',<NEWLINE>,1:5]
[@2,7:6='<EOF>',<EOF>,2:0]
这使我感到困惑,因为我期望“ asd90”不匹配,因为在我的语法中,LOWERCASE和DIGIT是2个不同的子规则,因此我希望它不会与“ WORD”匹配。
换句话说,就像“ intvoid”可以用作返回类型,而显然不是这样。
您似乎在考虑中想念循环运算符。词法分析器规则WORD
可以匹配任何LOWERCASE
,UPPERCASE
和DIGIT
的sequence,这意味着通过使用该循环的5次运行(一旦匹配了asd90
小写规则,并且一次匹配数字。
本书中的示例没有循环,因此它只能匹配一次,无论是类型还是void
。