package edu.byu.cs.roots.opg.io; import java.io.*; public class FSM{ public static final int EOF = -1; public static final int IGNORE = 0; public static final int NAME = 1; public static final int INDI = 2; public static final int BIRT = 3; public static final int DEAT = 4; public static final int FAM = 5; public static final int FAMC = 6; public static final int FAMS = 7; public static final int HEAD = 8; public static final int SEX = 9; public static final int DATE = 10; public static final int NPFX = 11; public static final int GIVN = 12; public static final int NICK = 13; public static final int SPFX = 14; public static final int SURN = 15; public static final int NSFX = 16; public static final int HUSB = 17; public static final int WIFE = 18; public static final int CHIL = 19; public static final int TRLR = 20; public static final int PLAC = 21; public static final int MARR = 22; public static final int Y = 23; public static final int INDIVIDUAL = 24; public static final int BIRTH = 25; public static final int DEATH = 26; public static final int FAMILY = 27; public static final int FAMILY_CHILD = 28; public static final int FAMILY_SPOUSE = 29; public static final int PLACE = 30; public static final int MARRIAGE = 31; public static final int TRAILER = 32; public static final int HUSBAND = 33; public static final int CHILD = 34; public static final int CLEARED = 35; public static final int COMPLETED = 36; public static final int INFANT = 37; public static final int PRE_1970 = 38; public static final int QUALIFIED = 39; public static final int STILLBORN = 40; public static final int SUBMITTED = 41; public static final int UNCLEARED = 42; public static final int BIC = 43; public static final int DNS = 44; public static final int CANCELED = 45; public static final int DNS_CAN = 46; public static final int BAPL = 47; public static final int CONL = 48; public static final int ENDL = 49; public static final int SLGC = 50; public static final int SLGS = 51; public static final int STAT = 52; public static final int OBJE = 53; public static final int FILE = 54; public static final int LEVEL_0 = 55; public static final int LEVEL_1 = 56; public static final int LEVEL_2 = 57; public static final int LEVEL_3 = 58; public static final int LEVEL_4 = 59; public static final int LEVEL_5 = 60; public static final int LEVEL_6 = 61; public static final int _PRIMARY = 62; public BufferedReader reader; public int lineNumber = 1; public int markLine = 1; public FSM(String fileName) throws IOException { // Reader in = new InputStreamReader(new FileInputStream(fileName)); this.reader = new BufferedReader(new FileReader(fileName)); 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(); } 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,0,0,0,0,0,35,0,0,0,0,0,0,0,36,0,0,0,37,0,0,0,0,0,0,38,0,0,0,0,0,0,0,0,39,0,0,0,0,0,0,0,40,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,42,43,0,44,0,0,0,0,0,0,45,0,0,0,46,0,0,47,0,48,0,0,0,49,0,0,50,51,0,52,0,0,0,53,0,0,54,55,56,57,58,59,60,61,0,0,0,0,0,0,0,0,62}; 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) || currentState == 219) && in != -1){ outer : switch(currentState){ case 0: switch(ch){ case 'O': currentState = 199; break outer; case '3': currentState = 209; break outer; case 'W': currentState = 54; break outer; case 'H': currentState = 22; break outer; case '0': currentState = 206; break outer; case 'P': currentState = 66; break outer; case 'G': currentState = 35; break outer; case '1': currentState = 207; break outer; case '6': currentState = 212; break outer; case 'I': currentState = 5; break outer; case '5': currentState = 211; break outer; case 'F': currentState = 17; break outer; case 'U': currentState = 161; break outer; case 'N': currentState = 1; break outer; case '4': currentState = 210; break outer; case 'S': currentState = 26; break outer; case 'D': currentState = 13; break outer; case 'C': currentState = 58; break outer; case '2': currentState = 208; break outer; case 'B': currentState = 9; break outer; case 'Q': currentState = 137; break outer; case 'M': currentState = 70; break outer; case 'Y': currentState = 74; break outer; case 'T': currentState = 62; break outer; case 'E': currentState = 189; break outer; case '_': currentState = 212; 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; case 'F': currentState = 126; 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; case 'A': currentState = 184; break outer; default: return 0; } case 10: switch(ch){ case 'R': currentState = 11; break outer; case 'C': currentState = 170; 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 'N': currentState = 171; 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 'I': currentState = 203; break outer; 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: switch(ch){ default: return 0; } case 21: switch(ch){ default: 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: switch(ch){ default: return 0; } case 26: switch(ch){ case 'U': currentState = 45; break outer; case 'T': currentState = 146; break outer; case 'P': currentState = 42; break outer; case 'L': currentState = 193; 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: switch(ch){ default: 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: switch(ch){ default: 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: switch(ch){ default: 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: switch(ch){ default: 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: switch(ch){ default: 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: switch(ch){ default: return 0; } case 45: switch(ch){ case 'R': currentState = 46; break outer; case 'B': currentState = 154; break outer; default: return 0; } case 46: switch(ch){ case 'N': currentState = 47; break outer; default: return 0; } case 47: switch(ch){ default: 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: switch(ch){ default: 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: switch(ch){ default: return 0; } case 58: switch(ch){ case 'O': currentState = 118; break outer; case 'A': currentState = 173; break outer; case 'H': currentState = 59; break outer; case 'L': currentState = 112; 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: switch(ch){ default: return 0; } case 66: switch(ch){ case 'R': currentState = 130; break outer; 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: switch(ch){ default: 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: switch(ch){ default: return 0; } case 81: switch(ch){ default: return 0; } case 82: switch(ch){ default: 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: switch(ch){ case 'L': currentState = 90; break outer; default: return 0; } case 90: switch(ch){ case 'D': currentState = 91; break outer; default: return 0; } case 91: switch(ch){ default: return 0; } case 92: switch(ch){ case 'P': currentState = 93; break outer; default: return 0; } case 93: switch(ch){ case 'O': currentState = 94; break outer; default: return 0; } case 94: switch(ch){ case 'U': currentState = 95; break outer; default: return 0; } case 95: switch(ch){ case 'S': currentState = 96; break outer; default: return 0; } case 96: switch(ch){ case 'E': currentState = 97; break outer; default: return 0; } case 97: switch(ch){ default: return 0; } case 98: switch(ch){ default: return 0; } case 99: switch(ch){ case 'A': currentState = 100; break outer; default: return 0; } case 100: switch(ch){ case 'G': currentState = 101; break outer; default: return 0; } case 101: switch(ch){ case 'E': currentState = 102; break outer; default: return 0; } case 102: switch(ch){ default: return 0; } case 103: switch(ch){ case 'I': currentState = 104; break outer; default: return 0; } case 104: switch(ch){ case 'L': currentState = 105; break outer; default: return 0; } case 105: switch(ch){ case 'E': currentState = 106; break outer; default: return 0; } case 106: switch(ch){ case 'R': currentState = 107; break outer; default: return 0; } case 107: switch(ch){ default: return 0; } case 108: switch(ch){ case 'N': currentState = 109; break outer; default: return 0; } case 109: switch(ch){ case 'D': currentState = 110; break outer; default: return 0; } case 110: switch(ch){ default: return 0; } case 111: switch(ch){ default: return 0; } case 112: switch(ch){ case 'E': currentState = 113; break outer; default: return 0; } case 113: switch(ch){ case 'A': currentState = 114; break outer; default: return 0; } case 114: switch(ch){ case 'R': currentState = 115; break outer; default: return 0; } case 115: switch(ch){ case 'E': currentState = 116; break outer; default: return 0; } case 116: switch(ch){ case 'D': currentState = 117; break outer; default: return 0; } case 117: switch(ch){ default: return 0; } case 118: switch(ch){ case 'M': currentState = 119; break outer; case 'N': currentState = 187; break outer; default: return 0; } case 119: switch(ch){ case 'P': currentState = 120; break outer; default: return 0; } case 120: switch(ch){ case 'L': currentState = 121; break outer; default: return 0; } case 121: switch(ch){ case 'E': currentState = 122; break outer; default: return 0; } case 122: switch(ch){ case 'T': currentState = 123; break outer; default: return 0; } case 123: switch(ch){ case 'E': currentState = 124; break outer; default: return 0; } case 124: switch(ch){ case 'D': currentState = 125; break outer; default: return 0; } case 125: switch(ch){ default: return 0; } case 126: switch(ch){ case 'A': currentState = 127; break outer; default: return 0; } case 127: switch(ch){ case 'N': currentState = 128; break outer; default: return 0; } case 128: switch(ch){ case 'T': currentState = 129; break outer; default: return 0; } case 129: switch(ch){ default: return 0; } case 130: switch(ch){ case 'E': currentState = 131; break outer; default: return 0; } case 131: switch(ch){ case '-': currentState = 132; break outer; default: return 0; } case 132: switch(ch){ case '1': currentState = 133; break outer; default: return 0; } case 133: switch(ch){ case '9': currentState = 134; break outer; default: return 0; } case 134: switch(ch){ case '7': currentState = 135; break outer; default: return 0; } case 135: switch(ch){ case '0': currentState = 136; break outer; default: return 0; } case 136: switch(ch){ default: return 0; } case 137: switch(ch){ case 'U': currentState = 138; break outer; default: return 0; } case 138: switch(ch){ case 'A': currentState = 139; break outer; default: return 0; } case 139: switch(ch){ case 'L': currentState = 140; break outer; default: return 0; } case 140: switch(ch){ case 'I': currentState = 141; break outer; default: return 0; } case 141: switch(ch){ case 'F': currentState = 142; break outer; default: return 0; } case 142: switch(ch){ case 'I': currentState = 143; break outer; default: return 0; } case 143: switch(ch){ case 'E': currentState = 144; break outer; default: return 0; } case 144: switch(ch){ case 'D': currentState = 145; break outer; default: return 0; } case 145: switch(ch){ default: return 0; } case 146: switch(ch){ case 'I': currentState = 147; break outer; case 'A': currentState = 197; break outer; default: return 0; } case 147: switch(ch){ case 'L': currentState = 148; break outer; default: return 0; } case 148: switch(ch){ case 'L': currentState = 149; break outer; default: return 0; } case 149: switch(ch){ case 'B': currentState = 150; break outer; default: return 0; } case 150: switch(ch){ case 'O': currentState = 151; break outer; default: return 0; } case 151: switch(ch){ case 'R': currentState = 152; break outer; default: return 0; } case 152: switch(ch){ case 'N': currentState = 153; break outer; default: return 0; } case 153: switch(ch){ default: return 0; } case 154: switch(ch){ case 'M': currentState = 155; break outer; default: return 0; } case 155: switch(ch){ case 'I': currentState = 156; break outer; default: return 0; } case 156: switch(ch){ case 'T': currentState = 157; break outer; default: return 0; } case 157: switch(ch){ case 'T': currentState = 158; break outer; default: return 0; } case 158: switch(ch){ case 'E': currentState = 159; break outer; default: return 0; } case 159: switch(ch){ case 'D': currentState = 160; break outer; default: return 0; } case 160: switch(ch){ default: return 0; } case 161: switch(ch){ case 'N': currentState = 162; break outer; default: return 0; } case 162: switch(ch){ case 'C': currentState = 163; break outer; default: return 0; } case 163: switch(ch){ case 'L': currentState = 164; break outer; default: return 0; } case 164: switch(ch){ case 'E': currentState = 165; break outer; default: return 0; } case 165: switch(ch){ case 'A': currentState = 166; break outer; default: return 0; } case 166: switch(ch){ case 'R': currentState = 167; break outer; default: return 0; } case 167: switch(ch){ case 'E': currentState = 168; break outer; default: return 0; } case 168: switch(ch){ case 'D': currentState = 169; break outer; default: return 0; } case 169: switch(ch){ default: return 0; } case 170: switch(ch){ default: return 0; } case 171: switch(ch){ case 'S': currentState = 172; break outer; default: return 0; } case 172: switch(ch){ case '/': currentState = 180; break outer; default: return 0; } case 173: switch(ch){ case 'N': currentState = 174; break outer; default: return 0; } case 174: switch(ch){ case 'C': currentState = 175; break outer; default: return 0; } case 175: switch(ch){ case 'E': currentState = 176; break outer; default: return 0; } case 176: switch(ch){ case 'L': currentState = 177; break outer; default: return 0; } case 177: switch(ch){ case 'E': currentState = 178; break outer; default: return 0; } case 178: switch(ch){ case 'D': currentState = 179; break outer; default: return 0; } case 179: switch(ch){ default: return 0; } case 180: switch(ch){ case 'C': currentState = 181; break outer; default: return 0; } case 181: switch(ch){ case 'A': currentState = 182; break outer; default: return 0; } case 182: switch(ch){ case 'N': currentState = 183; break outer; default: return 0; } case 183: switch(ch){ default: return 0; } case 184: switch(ch){ case 'P': currentState = 185; break outer; default: return 0; } case 185: switch(ch){ case 'L': currentState = 186; break outer; default: return 0; } case 186: switch(ch){ default: return 0; } case 187: switch(ch){ case 'L': currentState = 188; break outer; default: return 0; } case 188: switch(ch){ default: return 0; } case 189: switch(ch){ case 'N': currentState = 190; break outer; default: return 0; } case 190: switch(ch){ case 'D': currentState = 191; break outer; default: return 0; } case 191: switch(ch){ case 'L': currentState = 192; break outer; default: return 0; } case 192: switch(ch){ default: return 0; } case 193: switch(ch){ case 'G': currentState = 194; break outer; default: return 0; } case 194: switch(ch){ case 'S': currentState = 196; break outer; case 'C': currentState = 195; break outer; default: return 0; } case 195: switch(ch){ default: return 0; } case 196: switch(ch){ default: return 0; } case 197: switch(ch){ case 'T': currentState = 198; break outer; default: return 0; } case 198: switch(ch){ default: return 0; } case 199: switch(ch){ case 'B': currentState = 200; break outer; default: return 0; } case 200: switch(ch){ case 'J': currentState = 201; break outer; default: return 0; } case 201: switch(ch){ case 'E': currentState = 202; break outer; default: return 0; } case 202: switch(ch){ default: return 0; } case 203: switch(ch){ case 'L': currentState = 204; break outer; default: return 0; } case 204: switch(ch){ case 'E': currentState = 205; break outer; default: return 0; } case 205: switch(ch){ default: return 0; } case 206: switch(ch){ default: return 0; } case 207: switch(ch){ default: return 0; } case 208: switch(ch){ default: return 0; } case 209: switch(ch){ default: return 0; } case 210: switch(ch){ default: return 0; } case 211: switch(ch){ default: return 0; } case 212: switch(ch){ case 'P': currentState = 213; break outer; default: return 0; } case 213: switch(ch){ case 'R': currentState = 214; break outer; default: return 0; } case 214: switch(ch){ case 'I': currentState = 215; break outer; default: return 0; } case 215: switch(ch){ case 'M': currentState = 216; break outer; default: return 0; } case 216: switch(ch){ case 'A': currentState = 217; break outer; default: return 0; } case 217: switch(ch){ case 'R': currentState = 218; break outer; default: return 0; } case 218: switch(ch){ case 'Y': currentState = 219; break outer; default: return 0; } case 219: switch(ch){ case ' ': currentState = 220; break outer; default: return 0; } case 220: switch(ch){ case 'Y': currentState = 221; break outer; default: return 0; } case 221: switch(ch){ default: 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{ 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{ FSM fsm = new FSM("test.txt"); fsm.nextTokenId(); } }