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 }