【发布时间】:2019-12-17 09:31:50
【问题描述】:
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”可以作为返回类型,而它显然不会。
【问题讨论】:
-
LOWERCASE和DIGIT不是 2 个不同的子规则,它们是一个特定规则的片段(更准确地说是令牌)WORD。简单来说,这听起来像:“WORD可能包含小写字符或大写字符或数字”。这就是“asd90”的意义所在。至于intvoid- 它与int void不同。
标签: antlr antlr4 parentheses bnf ebnf