001    package sysModel.parser;
002    
003    import java.io.FileReader;
004    import java.io.IOException;
005    import java.io.StreamTokenizer;
006    
007    /**
008     * Wrapper around StreamTokenizer.
009     *
010     * @author Mathias Ricken
011     */
012    public class Lexer {
013        /**
014         * Stream tokenizer.
015         */
016        final StreamTokenizer _tok;
017    
018        /**
019         * Make a new parser.
020         *
021         * @param filename file to lex
022         * @throws IOException
023         */
024        public Lexer(String filename) throws IOException {
025            _tok = new StreamTokenizer(new FileReader(filename));
026    
027            _tok.wordChars(0, 255);
028            _tok.ordinaryChars(0, ' ');
029            _tok.whitespaceChars(0, ' ');
030            _tok.ordinaryChar('(');
031            _tok.ordinaryChar(')');
032            _tok.parseNumbers();
033            _tok.wordChars('.', '.');
034            _tok.ordinaryChar(',');
035            _tok.eolIsSignificant(false);
036        }
037    
038        /**
039         * Get the next token.
040         *
041         * @return next token
042         */
043        public IToken nextToken() {
044            try {
045                switch (_tok.nextToken()) {
046                    case StreamTokenizer.TT_WORD:
047                        {
048                            return new WordToken(_tok.sval);
049                        }
050                    case StreamTokenizer.TT_NUMBER:
051                        {
052                            return new NumberToken(_tok.nval);
053                        }
054                    case '(':
055                        {
056                            return OpenToken.instance();
057                        }
058                    case ')':
059                        {
060                            return CloseToken.instance();
061                        }
062                    case ',':
063                        {
064                            return CommaToken.instance();
065                        }
066                    case StreamTokenizer.TT_EOF:
067                        {
068                            return EndOfStreamToken.instance();
069                        }
070                    default:
071                        {
072                            throw new ParserException("Invalid token");
073                        }
074                }
075            }
076            catch (IOException e) {
077                throw new ParserException(e.toString(), e);
078            }
079        }
080    }