Почему java.util.Scanner next (). CharAt (0) возвращает «{», а мой метод nextCharIs (scanner, «{») возвращает false? - PullRequest
0 голосов
/ 13 октября 2019

Я пишу рекурсивный приличный синтаксический анализатор на Java и в своем методе чтения фактора проверяю, является ли следующий символ в моем сканере "{". Я использую метод 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+""));
}

1 Ответ

0 голосов
/ 13 октября 2019

Из документации Java : "Сканер разбивает свои входные данные на токены, используя шаблон разделителя , который по умолчанию соответствует пробелу ."

Без каких-либо дополнительных слоев, с которыми вы работаете 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;
    }
...