001    package jp.osdl.jbento2.analyzer;
002    
003    import java.io.IOException;
004    import java.io.Reader;
005    
006    public class GCTokenizer {
007    
008        Reader r;
009    
010        long lineNumber = 0;
011    
012        boolean reachedEOF = false;
013    
014        StringBuffer currentToken = new StringBuffer();
015    
016        StringBuffer nextToken = new StringBuffer();
017    
018        public GCTokenizer(Reader r) {
019            this.r = r;
020        }
021    
022        public long getLineNumber() {
023            return lineNumber;
024        }
025    
026        protected String getToken() throws IOException {
027            int c = 0;
028            boolean completeToken = false;
029            while (true) {
030                if (nextToken.length() != 0) {
031                    String result = nextToken.toString();
032                    nextToken = new StringBuffer();
033                    return result;
034                }
035                if (reachedEOF) {
036                    return null;
037                }
038                c = r.read();
039                switch (c) {
040                case ' ':
041                case ',': {
042                    if (currentToken.length() != 0) {
043                        completeToken = true;
044                    }
045                    break;
046                }
047                case '\r': {
048                    break;
049                }
050                case '\n': {
051                    if (currentToken.length() != 0) {
052                        completeToken = true;
053                    }
054                    lineNumber++;
055                    break;
056                }
057                case '[':
058                case ']':
059                case '(':
060                case ')':
061                case ':': {
062                    nextToken.append((char) c);
063                    if (currentToken.length() != 0) {
064                        completeToken = true;
065                    }
066                    break;
067                }
068                case -1: {
069                    reachedEOF = true;
070                    if (currentToken.length() != 0) {
071                        completeToken = true;
072                        break;
073                    }
074                }
075                default: {
076                    currentToken.append((char) c);
077                }
078                }
079                if (completeToken) {
080                    break;
081                }
082            }
083            String result = currentToken.toString();
084            currentToken = new StringBuffer();
085            return result;
086        }
087    
088        protected void skipLine() throws IOException {
089            int c = 0;
090            boolean skipped = false;
091            if (currentToken.length() != 0) {
092                currentToken = new StringBuffer();
093            }
094            if (nextToken.length() != 0) {
095                nextToken = new StringBuffer();
096            }
097            while (true) {
098                c = r.read();
099                switch (c) {
100                case '\r': {
101                    c = r.read();
102                    if (c == '\n') {
103                        skipped = true;
104                        break;
105                    } else if (c == -1) {
106                        reachedEOF = true;
107                        skipped = true;
108                        break;
109                    } else {
110                        currentToken.append((char) c);
111                        skipped = true;
112                        break;
113                    }
114                }
115                case '\n': {
116                    skipped = true;
117                    break;
118                }
119                case -1: {
120                    reachedEOF = true;
121                    skipped = true;
122                    break;
123                }
124                }
125                if (skipped) {
126                    lineNumber++;
127                    return;
128                }
129            }
130        }
131    
132        protected void skipTo(int pointer) throws IOException {
133            int c = 0;
134            if (currentToken.length() != 0) {
135                currentToken = new StringBuffer();
136            }
137            if (nextToken.length() != 0) {
138                nextToken = new StringBuffer();
139            }
140            while (true) {
141                c = r.read();
142                if (c == pointer) {
143                    break;
144                }
145            }
146        }
147    }