package edu.byu.cs.roots.opg.io; import java.io.*; public class FSMold{ private BufferedReader reader; public int lineNumber = 1; public int markLine = 1; public FSMold(String fileName){ try{ Reader in = new InputStreamReader(new FileInputStream(fileName)); this.reader = new BufferedReader(in); }catch(IOException e){ e.printStackTrace(); } try { reader.mark(10); int ch; if((ch = reader.read()) == '0') reader.reset(); else while(ch != '0' && ch != -1){ reader.mark(2); ch = reader.read(); } reader.reset(); } catch (IOException e) { e.printStackTrace(); } } public int nextTokenId() throws IOException{ int[] tokenIds = {0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,5,6,7,0,0,0,8,0,0,9,0,0,10,0,0,11,0,0,0,12,0,0,13,0,0,14,0,0,15,0,0,16,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,23,0,0,0,0,0,24,25,26,0,0,27,0,0,0,0,0,28,0,0,0,0,0,29,30,0,0,0,31,0,0,0,0,32,0,0,33,34,35,36,37,38,39,40,41}; int currentState = 0; int in; char ch; while((in = reader.read()) != -1 && Character.isWhitespace((char)in)){ if(in == '\n') lineNumber++; } if(in == -1) return -1; while(!Character.isWhitespace(ch=(char)in) && in != -1){ outer : switch(currentState){ case 0: switch(ch){ case 'S': currentState = 26; break outer; case 'D': currentState = 13; break outer; case '3': currentState = 115; break outer; case 'W': currentState = 54; break outer; case 'H': currentState = 22; break outer; case '2': currentState = 114; break outer; case 'C': currentState = 58; break outer; case '0': currentState = 112; break outer; case 'P': currentState = 66; break outer; case 'B': currentState = 9; break outer; case '6': currentState = 118; break outer; case '1': currentState = 113; break outer; case 'G': currentState = 35; break outer; case 'I': currentState = 5; break outer; case 'M': currentState = 70; break outer; case '5': currentState = 117; break outer; case 'F': currentState = 17; break outer; case 'Y': currentState = 74; break outer; case 'T': currentState = 62; break outer; case 'N': currentState = 1; break outer; case '4': currentState = 116; break outer; default: return 0; } case 1: switch(ch){ case 'S': currentState = 48; break outer; case 'I': currentState = 39; break outer; case 'A': currentState = 2; break outer; case 'P': currentState = 32; break outer; default: return 0; } case 2: switch(ch){ case 'M': currentState = 3; break outer; default: return 0; } case 3: switch(ch){ case 'E': currentState = 4; break outer; default: return 0; } case 4: switch(ch){ default: return 0; } case 5: switch(ch){ case 'N': currentState = 6; break outer; default: return 0; } case 6: switch(ch){ case 'D': currentState = 7; break outer; default: return 0; } case 7: switch(ch){ case 'I': currentState = 8; break outer; default: return 0; } case 8: switch(ch){ case 'V': currentState = 75; break outer; default: return 0; } case 9: switch(ch){ case 'I': currentState = 10; break outer; default: return 0; } case 10: switch(ch){ case 'R': currentState = 11; break outer; default: return 0; } case 11: switch(ch){ case 'T': currentState = 12; break outer; default: return 0; } case 12: switch(ch){ case 'H': currentState = 81; break outer; default: return 0; } case 13: switch(ch){ case 'A': currentState = 29; break outer; case 'E': currentState = 14; break outer; default: return 0; } case 14: switch(ch){ case 'A': currentState = 15; break outer; default: return 0; } case 15: switch(ch){ case 'T': currentState = 16; break outer; default: return 0; } case 16: switch(ch){ case 'H': currentState = 82; break outer; default: return 0; } case 17: switch(ch){ case 'A': currentState = 18; break outer; default: return 0; } case 18: switch(ch){ case 'M': currentState = 19; break outer; default: return 0; } case 19: switch(ch){ case 'S': currentState = 21; break outer; case 'I': currentState = 83; break outer; case 'C': currentState = 20; break outer; default: return 0; } case 20: return 0; case 21: return 0; case 22: switch(ch){ case 'U': currentState = 51; break outer; case 'E': currentState = 23; break outer; default: return 0; } case 23: switch(ch){ case 'A': currentState = 24; break outer; default: return 0; } case 24: switch(ch){ case 'D': currentState = 25; break outer; default: return 0; } case 25: return 0; case 26: switch(ch){ case 'U': currentState = 45; break outer; case 'P': currentState = 42; break outer; case 'E': currentState = 27; break outer; default: return 0; } case 27: switch(ch){ case 'X': currentState = 28; break outer; default: return 0; } case 28: return 0; case 29: switch(ch){ case 'T': currentState = 30; break outer; default: return 0; } case 30: switch(ch){ case 'E': currentState = 31; break outer; default: return 0; } case 31: return 0; case 32: switch(ch){ case 'F': currentState = 33; break outer; default: return 0; } case 33: switch(ch){ case 'X': currentState = 34; break outer; default: return 0; } case 34: return 0; case 35: switch(ch){ case 'I': currentState = 36; break outer; default: return 0; } case 36: switch(ch){ case 'V': currentState = 37; break outer; default: return 0; } case 37: switch(ch){ case 'N': currentState = 38; break outer; default: return 0; } case 38: return 0; case 39: switch(ch){ case 'C': currentState = 40; break outer; default: return 0; } case 40: switch(ch){ case 'K': currentState = 41; break outer; default: return 0; } case 41: return 0; case 42: switch(ch){ case 'F': currentState = 43; break outer; default: return 0; } case 43: switch(ch){ case 'X': currentState = 44; break outer; default: return 0; } case 44: return 0; case 45: switch(ch){ case 'R': currentState = 46; break outer; default: return 0; } case 46: switch(ch){ case 'N': currentState = 47; break outer; default: return 0; } case 47: return 0; case 48: switch(ch){ case 'F': currentState = 49; break outer; default: return 0; } case 49: switch(ch){ case 'X': currentState = 50; break outer; default: return 0; } case 50: return 0; case 51: switch(ch){ case 'S': currentState = 52; break outer; default: return 0; } case 52: switch(ch){ case 'B': currentState = 53; break outer; default: return 0; } case 53: switch(ch){ case 'A': currentState = 108; break outer; default: return 0; } case 54: switch(ch){ case 'I': currentState = 55; break outer; default: return 0; } case 55: switch(ch){ case 'F': currentState = 56; break outer; default: return 0; } case 56: switch(ch){ case 'E': currentState = 57; break outer; default: return 0; } case 57: return 0; case 58: switch(ch){ case 'H': currentState = 59; break outer; default: return 0; } case 59: switch(ch){ case 'I': currentState = 60; break outer; default: return 0; } case 60: switch(ch){ case 'L': currentState = 61; break outer; default: return 0; } case 61: switch(ch){ case 'D': currentState = 111; break outer; default: return 0; } case 62: switch(ch){ case 'R': currentState = 63; break outer; default: return 0; } case 63: switch(ch){ case 'A': currentState = 103; break outer; case 'L': currentState = 64; break outer; default: return 0; } case 64: switch(ch){ case 'R': currentState = 65; break outer; default: return 0; } case 65: return 0; case 66: switch(ch){ case 'L': currentState = 67; break outer; default: return 0; } case 67: switch(ch){ case 'A': currentState = 68; break outer; default: return 0; } case 68: switch(ch){ case 'C': currentState = 69; break outer; default: return 0; } case 69: switch(ch){ case 'E': currentState = 98; break outer; default: return 0; } case 70: switch(ch){ case 'A': currentState = 71; break outer; default: return 0; } case 71: switch(ch){ case 'R': currentState = 72; break outer; default: return 0; } case 72: switch(ch){ case 'R': currentState = 73; break outer; default: return 0; } case 73: switch(ch){ case 'I': currentState = 99; break outer; default: return 0; } case 74: return 0; case 75: switch(ch){ case 'I': currentState = 76; break outer; default: return 0; } case 76: switch(ch){ case 'D': currentState = 77; break outer; default: return 0; } case 77: switch(ch){ case 'U': currentState = 78; break outer; default: return 0; } case 78: switch(ch){ case 'A': currentState = 79; break outer; default: return 0; } case 79: switch(ch){ case 'L': currentState = 80; break outer; default: return 0; } case 80: return 0; case 81: return 0; case 82: return 0; case 83: switch(ch){ case 'L': currentState = 84; break outer; default: return 0; } case 84: switch(ch){ case 'Y': currentState = 85; break outer; default: return 0; } case 85: switch(ch){ case '_': currentState = 86; break outer; default: return 0; } case 86: switch(ch){ case 'S': currentState = 92; break outer; case 'C': currentState = 87; break outer; default: return 0; } case 87: switch(ch){ case 'H': currentState = 88; break outer; default: return 0; } case 88: switch(ch){ case 'I': currentState = 89; break outer; default: return 0; } case 89: if(ch == 'L'){ currentState = 90; break outer; } else return 0; case 90: if(ch == 'D'){ currentState = 91; break outer; } else return 0; case 91: return 0; case 92: if(ch == 'P'){ currentState = 93; break outer; } else return 0; case 93: if(ch == 'O'){ currentState = 94; break outer; } else return 0; case 94: if(ch == 'U'){ currentState = 95; break outer; } else return 0; case 95: if(ch == 'S'){ currentState = 96; break outer; } else return 0; case 96: if(ch == 'E'){ currentState = 97; break outer; } else return 0; case 97: return 0; case 98: return 0; case 99: if(ch == 'A'){ currentState = 100; break outer; } else return 0; case 100: if(ch == 'G'){ currentState = 101; break outer; } else return 0; case 101: if(ch == 'E'){ currentState = 102; break outer; } else return 0; case 102: return 0; case 103: if(ch == 'I'){ currentState = 104; break outer; } else return 0; case 104: if(ch == 'L'){ currentState = 105; break outer; } else return 0; case 105: if(ch == 'E'){ currentState = 106; break outer; } else return 0; case 106: if(ch == 'R'){ currentState = 107; break outer; } else return 0; case 107: return 0; case 108: if(ch == 'N'){ currentState = 109; break outer; } else return 0; case 109: if(ch == 'D'){ currentState = 110; break outer; } else return 0; case 110: return 0; case 111: return 0; case 112: return 0; case 113: return 0; case 114: return 0; case 115: return 0; case 116: return 0; case 117: return 0; } in = reader.read(); } return tokenIds[currentState]; } public int peekTokenId() throws IOException{ reader.mark(100); markLine = lineNumber; int id = nextTokenId(); return id; } public int peekTokenId(int ahead) throws IOException{ reader.mark(100); markLine = lineNumber; int id = -1; for(int i=0; i<ahead; i++){ id = nextTokenId(); } return id; } public void resetToken() throws IOException{ reader.reset(); lineNumber = markLine; } public void skipLine() throws IOException{ lineNumber++; reader.readLine(); } public String nextLine() throws IOException{ this.lineNumber++; return reader.readLine(); } public String nextWord() throws IOException{ StringBuilder word = new StringBuilder(); char ch; try{ while((ch = (char) reader.read()) != ' ' && ch != '\t' && ch != '\n' && ch != '\r') word.append(ch); if(ch == '\n') lineNumber++; }catch(IOException e){ System.out.println("Error"); return null; } return word.toString(); } public static void main(String[] args) throws IOException{ } }