<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/************************
 * CS211 Fall 2003      *
 * CS211In.java         *
 ************************/

import java.io.*;

// Tokenizer
public class CS211In implements CS211InInterface {
    
    // Instance variable declarations:    
    String Name;
    InputStream in;
    boolean reading_file = false;
    StreamTokenizer tokens;
    boolean errorp = false; // To avoid multiple error messages
    
    // Open a file for input:
    public CS211In (String FileName) {
	try { 
	    Name = FileName;
	    in = new FileInputStream(FileName);
	    reading_file = true;
	    Reader r = new BufferedReader(new InputStreamReader(in));
	    tokens = new StreamTokenizer(r);
	    tokens.wordChars(':',':');
	} catch (Exception e) { // Do not report any exceptions
	    System.out.println("ERROR: Unable to open file " + FileName + " for input\n");
	    errorp = true;
	}
    }
    
    // Open a Reader for input:
    public CS211In (Reader r) {
	Name = "string";
	tokens = new StreamTokenizer(r);
	tokens.wordChars(':',':');
    }
    
	// Open System.in for input:
    public CS211In () {
	Name = "System.in";
	tokens = new StreamTokenizer(new InputStreamReader(System.in));
	tokens.wordChars(':',':');
    }
	
    // Get an integer from file:
    public int getInt () {
	try {
	    if (tokens.nextToken() == tokens.TT_NUMBER)
		return (int)tokens.nval;
	    else
		throw new Exception();
	} catch (Exception e) {
	    if (! errorp)
		System.out.println("ERROR: Attempt to read a non-integer value as an integer\n");
	    errorp = true;
	    return 0;
	}
    }
    
    // Get a word from file:
    public String getWord () {
	try {
	    if (tokens.nextToken() == tokens.TT_WORD)
		return tokens.sval;
	    else 
                throw new Exception();
	} catch (Exception e) {
	    if (! errorp)
		System.out.println("ERROR: Attempt to read a non-word value as a word\n");
	    errorp = true;
	    return "";
	}
    }
    
    // Get an operator (!(wordChar,numberChar,EOF)) from file:
    public char getOp () {
	try {
	    if ((tokens.nextToken() != tokens.TT_NUMBER)
		&amp;&amp; (tokens.ttype != tokens.TT_WORD)
		&amp;&amp; (tokens.ttype != tokens.TT_EOF))
		return (char)tokens.ttype;
	    else
		throw new Exception();
	} catch (Exception e) {
	    if (! errorp) 
		System.out.println("ERROR: Attempt to read non-operator value as an operator\n");
	    errorp = true;
	    return (char)0;
	}
    }
    
    // Peek at the next token and return its "kind":
    public int peekAtKind () { // look at kind of next token w/o eating it
	try {
	    int kind = tokens.nextToken();
	    switch (kind) {
	    case StreamTokenizer.TT_EOF:    tokens.pushBack(); return EOF;
	    case StreamTokenizer.TT_NUMBER: tokens.pushBack(); return INTEGER;
	    case StreamTokenizer.TT_WORD:   tokens.pushBack(); return WORD;
	    default: tokens.pushBack(); return OPERATOR; //character found
	    }
	} catch (Exception e) {
	    if (! errorp) 
		System.out.println("ERROR: Unable to peek into file " + Name);
	    errorp = true;
	    return 0;
	}
    }
    
    // Make sure next token in input is operator c:
    public void match(char c) {
	char n;
	if (peekAtKind() == OPERATOR) {
            n = getOp();
	    if (n == c)
                return;
	    else {
                System.out.println(
				   "Expecting " + c + " but found " + n + " in Line " + lineNo());
		return;
	    }
	} else
            System.out.println("Did not find " + c + " in Line " + lineNo());
    }
    
    // Make sure next token in input is word s:
    public void match(String s) {
	String n;
	if (peekAtKind() == WORD) {
            n = getWord();
	    if (n.equals(s))
                return;
	    else {
                System.out.println("Expecting " + s + " but found " +
                                   n + " in Line " + lineNo());
		return;
	    }
	} else
            System.out.println("Did not find " + s + " in Line " + lineNo());
    }
    
    public boolean check(char c) {
	// Look for c but don't panic if you don't find it:
	if (peekAtKind() == OPERATOR) {
            char n = getOp();
	    if (n == c) 
                return true;
	    else {
                pushBack();
                return false;
            }
	} else 
            return false;
    }
    
    public boolean check(String s) {
	// Look for s but don't panic if you don't find it:
	if (peekAtKind() == WORD) {
            String n = getWord();
	    if (n.equals(s)) 
                return true;
	    else {
                pushBack();
                return false;
            }
	} else 
            return false;
    }
    
    // Pushes one token back into input stream:
    public void pushBack() { tokens.pushBack(); }
    
    // Return the line number:
    public int lineNo()    { return tokens.lineno(); }
    
    // Close file:
    public void close () {
	if (reading_file)
	    try { in.close(); }
	    catch (Exception e) {
		if (! errorp)
		    System.out.println("Error: Unable to close file " + Name);
		errorp = true;
	    }
    }
}
</pre></body></html>