我遇到一些问题。我添加了一个带有规则的令牌:
NUMBER : [0-9]+.?[0-9]*;
WHITESPACE : [ \t\r\n]+ -> skip ;
我使用JUnit测试我的程序,如果我使用以下代码:
@Test
public void testWhiteSpaces() {
verifyLexer(" \n7 \t", new String[] {"7"});
}
public void verifyLexer(String input, String[] expectedTokens) {
CharStream stream = new ANTLRInputStream(input);
ExpressionLexer lexer = new ExpressionLexer(stream);
lexer.reportErrorsAsExceptions();
List<? extends Token> actualTokens = lexer.getAllTokens();
assertEquals(expectedTokens.length, actualTokens.size());
for(int i = 0; i < actualTokens.size(); i++) {
String actualToken = actualTokens.get(i).getText();
String expectedToken = expectedTokens[i];
System.out.println(actualToken + "?");
assertEquals(actualToken, expectedToken);
}
JUnit测试失败,它说它找到的令牌是“7”而不是“7”我的目标。怎么会? NUMBER令牌的注册表达式中没有涉及空格......
答案 0 :(得分:2)
我想你忘了逃避正则表达式中的点:
[0-9]+\.?[0-9]*
点是一个匹配任何东西的特殊字符。在你的情况下的空白区域。