我正在用Java编写递归的体面解析器,并在读取的Factor方法中检查扫描器中的下一个字符是否为“ {”。我使用方法nextCharIs(Scanner in, Char c)
确定下一个字符是否与模式匹配。在此代码中,扫描仪中的下一个字符为“ {”,但该方法返回false。 nextChar
返回“ {”,而nextCharIs(in,"{")
返回false。为什么会这样?
char nextChar(Scanner in) {
return in.next().charAt(0);
}
boolean nextCharIs(Scanner in, char c) {
return in.hasNext(Pattern.quote(c+""));
}
答案 0 :(得分:0)
在Java documentation中:“扫描程序使用定界符模式将输入分为令牌,默认情况下与空格匹配。”
您正在使用scanner.hasNext(Pattern.quote("{"))
进行操作的任何额外图层都没有。如果您还有new Scanner(someText);
,则可能是这种情况。我必须将“ {”替换为“ x”,否则我的降价检查会出现问题:
someText hasNext(Pattern.quote("x")) "x" y "xx" n "x " y "x x" y
@Test
public void testScan(){
assertEquals(Collections.emptyList(), scanLBrace("x"));
assertEquals(Collections.emptyList(), scanLBrace("{{"));
assertEquals(Arrays.asList("{"), scanLBrace("{"));
assertEquals(Arrays.asList("{", "{"), scanLBrace("{ {"));
}
List<String> scanLBrace(String text){
List<String> result = new ArrayList<>();
Scanner s = new Scanner(text);
while (s.hasNext(Pattern.quote("{")))
{
result.add(s.next());
}
return result;
}