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 }