我今天开始尝试使用ANTLR3。在我使用的表达中似乎存在差异。
我希望我的班级名字以大写字母开头,然后是大写字母和数字。例如,Car
有效,8Car
无效。
CLASS_NAME : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;
当我单独测试时,这可以正常工作。但是,当我在以下规则中使用它时,
model
: '~model' CLASS_NAME model_block
;
然而,CLASS_NAME
开始从数字开始获取类名。在这种情况下,ANTLR选择Car
,8Car
甚至#Car
作为有效令牌。我错过了一些愚蠢的话。任何指针将不胜感激。感谢。
答案 0 :(得分:1)
CLASS_NAME
与8Car
或#Car
不匹配。您可能正在使用ANTLRWorks的解释器(或Eclipse插件,它使用相同的解释器),这是在您不知道的UI选项卡上打印错误,并在令牌中显示不正确的字符。改为使用ANTLRWorks的调试器,或者自己编写一个小测试类:
grammar T;
parse : CLASS_NAME EOF;
CLASS_NAME : ('A'..'Z')('a'..'z'|'A'..'Z'|'0'..'9')*;
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
TLexer lexer = new TLexer(new ANTLRStringStream("8Car"));
TParser parser = new TParser(new CommonTokenStream(lexer));
parser.parse();
}
}