Разбор строки в токены - PullRequest
       8

Разбор строки в токены

0 голосов
/ 22 ноября 2018

У меня есть программа, которая принимает входящий текст, преобразует его в тип Reader и возвращает следующий токен, будь то слово или пробел (не слово).Это не ведет себя, как ожидалось.

Чтобы быть как можно более конкретным, вот моя инфраструктура тестирования в Eclipse с использованием JUnit4:

@Test
    public void testGetNextTokenWord() throws IOException {
        Reader in = new StringReader("Aren't you \ntired"); 
        TokenScanner d = new TokenScanner(in);
        try {
            assertTrue("has next", d.hasNext());
            assertEquals("Aren't", d.next());
            assertTrue("has next", d.hasNext());
            assertEquals(" ", d.next());
            assertTrue("has next", d.hasNext());
            assertEquals("you", d.next());
            assertTrue("has next", d.hasNext());
            assertEquals(" \n", d.next());
            assertTrue("has next", d.hasNext());
            assertEquals("tired", d.next());

            assertFalse("reached end of stream", d.hasNext());
        } finally {
            in.close();
        }
    }

Я опубликую полный код, чтобы облегчить помощь по этой проблеме, а затем опубликую ожидаемое и наблюдаемое поведение:

//Reads as much to determine hasNext() and next()
    public TokenScanner(java.io.Reader in) throws IOException {

        //Throw exception if null
        if (in == null) {
            throw new IllegalArgumentException();
        }

        //Read in token
        try {   

            System.out.println("TokenScanner!");
            //Create new token scanner for argued reader
            this.tokenScanner = in;

            //Read next character
            ch = tokenScanner.read();
        }

        //Throw exception if error in reading
        catch (IOException e){
            ch = -1;
        }    
    }

//Determines whether the argued character is a valid word character.
    public static boolean isWordCharacter(int c) {

        //Cast int character to a char
        char character = (char)c;

        //Return true if character is valid word character
        if(Character.isLetter(character) || character == '\'') {
            return true;    
        }

        //Return false otherwise
        return false;
    }

//Determine whether another token is avaialble
    public boolean hasNext() {

        //Leverage invariant
        return ch != -1 ;
    }

И функция, из-за которой возникает много головной боли (потенциально)

//Determine next token
    public String next() {

        //End of stream reached
        if(!hasNext()) {
            throw new NoSuchElementException();
        }

        //Initialize variable to hold token
        String word = "";

        try {

            //Character is a word character
            while(isWordCharacter(ch)) {
                word = word + (char)ch;
                ch = tokenScanner.read();

            }

            //Character is a space
            while(!Character.isWhitespace(ch)) {
                word = word + (char)ch;
                ch = tokenScanner.read();

            }           

            System.out.println("Word is: "+ word);
            return word;
        }

        //Exception catching
        catch(Exception e) {

            throw new NoSuchElementException();

        }   
    }

Ожидаемый результат с учетом приведенной выше инфраструктуры тестирования:

TokenScanner!
Word is: Aren't
Word is: you
Word is: /*Not sure how to represent newline in output*/
Word is: tired

Фактический результат ниже:

TokenScanner!
Word is: Aren't
Word is:

Вопрос в том, почему это происходит?

Мой вывод показывает, что первыйТест на неудачу:

assertEquals(" ", d.next());

Фундаментальный вопрос здесь заключается в том, как я представляю не слова (пробелы).Последний тест также не проходит.Любая помощь здесь приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...