in jdwpgen/src/main/java/build/tools/jdwpgen/Parse.java [123:184]
Node item() throws IOException {
switch (izer.nextToken()) {
case StreamTokenizer.TT_EOF:
error("Unexpect end-of-file");
return null;
case StreamTokenizer.TT_WORD: {
String name = izer.sval;
if (izer.nextToken() == '=') {
int ntok = izer.nextToken();
if (ntok == StreamTokenizer.TT_WORD) {
return new NameValueNode(name, izer.sval);
} else if (ntok == '\'') {
return new NameValueNode(name, izer.sval.charAt(0));
} else {
error("Expected value after: " + name + " =");
return null;
}
} else {
izer.pushBack();
return new NameNode(name);
}
}
case '"':
return new CommentNode(izer.sval);
case '(': {
if (izer.nextToken() == StreamTokenizer.TT_WORD) {
String kind = izer.sval;
List<Node> list = new ArrayList<>();
while (izer.nextToken() != ')') {
izer.pushBack();
list.add(item());
}
Node proto = kindMap.get(kind);
if (proto == null) {
error("Invalid kind: " + kind);
return null;
} else {
try {
Node node = proto.getClass().newInstance();
node.set(kind, list, izer.lineno());
return node;
} catch (InstantiationException | IllegalAccessException exc) {
error(exc.toString());
return null;
}
}
} else {
error("Expected kind identifier, got " + izer.ttype +
" : " + izer.sval);
return null;
}
}
default:
error("Unexpected character: '" + (char)izer.ttype + "'");
return null;
}
}