import java.util.HashSet;
import java.util.Iterator;
import java.util.Arrays;

/**
 * Tokenizer for the Logo2006 language. Provides an interface to
 * Tokenizer.java that reclassifies certain names as "keywords".
 * 
 * @author David Matuszek
 * @version Feb 20, 2006
 */
public class LogoTokenizer extends Tokenizer implements Iterable {
    String inputString;
    static String[] keywords = { "move", "turn", "penup", "pendown", "color",
                                 "home", "repeat", "while", "if", "else", "call",
                                 "north", "south", "east", "west", "left", "right",
                                 "magenta", "red", "orange", "yellow", "green",
                                 "aqua", "blue", "purple", "violet", "brown",
                                 "black", "charcoal", "gray", "grey", "white", "pink",
                                 "and", "or", "not", "define", "end" };
    static HashSet<String> keywordMap = new HashSet<String>(Arrays.asList(keywords));
    
    /**
     * Constructor for LogoTokenizer objects.
     * @param inputString The String to be tokenized.
     */
    public LogoTokenizer(String inputString) {
        super(inputString);
        this.inputString = inputString;
    }
    
    /**
     * Convenience method to test whether a given word is a keyword.
     * 
     * @param word The word to be tested.
     * @return <code>true</code> if the word is a keyword.
     */
    static boolean isKeyword(String word) {
        return keywordMap.contains(word);
    }
    
    /**
     * Returns the next Logo token.
     * @return The next token.
     * @see Tokenizer#next()
     */
    @Override
    public Object next() {
        Token token = (Token) super.next();
        if (keywordMap.contains(token.value)) {
            token.type = Type.KEYWORD;
        }
        return token;
    }

    /**
     * Returns a new LogoIterator.
     * 
     * @return A LogoIterator.
     * @see java.lang.Iterable#iterator()
     */
    public Iterator iterator() {
        return new LogoIterator(inputString);
    }
    
    private class LogoIterator implements Iterator {
        Tokenizer rawTokenizer;
        
        LogoIterator(String string) {
            rawTokenizer = new Tokenizer(string);
        }
        
        public boolean hasNext() {
            return rawTokenizer.hasNext();
        }

        public Object next() {
            Token token = (Token) rawTokenizer.next();
            if (keywordMap.contains(token.value)) {
                token.type = Type.KEYWORD;
            }
            return token;
        }

        public void remove() {
            rawTokenizer.remove();
        }
        
    }
}

