1 package examples.binding; 2 3 import java.io.File ; 4 import java.io.FileReader ; 5 import java.io.Reader ; 6 import java.io.IOException ; 7 8 public class Parser { 9 private Reader reader; 10 private char current; 11 private boolean EOF=false; 12 private int line = 1; 13 14 public Parser(Reader r) 15 throws IOException 16 { 17 this.reader = r; 18 accept(); 19 } 20 21 public boolean reachedEOF() { 22 return EOF; 23 } 24 25 public char current() { 26 return current; 27 } 28 29 public boolean isSpace() { 30 return current == ' ' || current == '\r' 31 || current == '\t' || current == '\n'; 32 } 33 34 public void skipSpace() 35 throws IOException 36 { 37 while (isSpace() && !reachedEOF()) accept(); 38 } 39 40 public String error() { 41 return "\nParse error at line:"+line+" char:"+current(); 42 } 43 44 public void accept() 45 throws IOException 46 { 47 int c = reader.read(); 48 if (c == -1) EOF = true; 49 current = (char) c; 50 if (c == '\n') line ++; 51 } 52 53 public void accept(char c) 54 throws IOException 55 { 56 if (current() == c) 57 accept(); 58 else 59 throw new IOException ("Unable to match character["+c+"]"+error()); 60 } 61 62 public void accept(String s) 63 throws IOException 64 { 65 int i=0; 66 while (i < s.length()) { 67 if (s.charAt(i) == current()) { accept(); i++; } 68 else 69 throw new IOException ("Unable to match string["+s+"]"+error()); 70 } 71 } 72 73 public String readString() 74 throws IOException 75 { 76 StringBuffer b = new StringBuffer (); 77 while (current() != ' ' && 78 current() != '\n' && 79 current() != '\r' && 80 current() != '\t' && 81 current() != ';' && 82 !reachedEOF()) { 83 b.append(current()); 84 accept(); 85 } 86 return b.toString(); 87 } 88 89 public BeanDescription parse() 90 throws IOException 91 { 92 BeanDescription desc = new BeanDescription(); 93 skipSpace(); 94 accept("Package:"); 95 skipSpace(); 96 String packageName = readString(); 97 skipSpace(); 99 accept("Namespace:"); 100 skipSpace(); 101 String namespace = readString(); 102 skipSpace(); 104 desc.setPackageName(packageName); 105 desc.setNamespaceName(namespace); 106 while(!reachedEOF()) { 107 desc.addBean(parseBeanInfo()); 108 } 109 return desc; 110 } 111 112 public BeanInfo parseBeanInfo() 113 throws IOException 114 { 115 BeanInfo info = new BeanInfo(); 116 skipSpace(); 117 String name = readString(); 118 info.setName(name); 119 skipSpace(); 121 accept('{'); 122 while(current()!='}') { 123 skipSpace(); 124 info.addProperty(parseProperty()); 125 skipSpace(); 126 } 127 accept('}'); 128 skipSpace(); 129 return info; 130 } 131 132 public Property parseProperty() 133 throws IOException 134 { 135 skipSpace(); 136 String type = readString(); 137 skipSpace(); 138 String prop = readString(); 139 skipSpace(); 140 accept(';'); 141 if ("Integer".equals(type)) { 142 return new Property(prop,Property.INTEGER); 143 } else if ("String".equals(type)) { 144 return new Property(prop,Property.STRING); 145 } else { 146 return new Property(prop,Property.BEAN,type); 147 } 148 } 149 150 public static void main(String args[]) 151 throws Exception 152 { 153 Parser parser = new Parser(new java.io.FileReader (args[0])); 154 BeanDescription description = parser.parse(); 155 System.out.println(description); 156 } 157 } 158 159 | Popular Tags |