コード例 #1
0
ファイル: ParseNode.java プロジェクト: jasonosgood/fado
 public static void toParseTree(StringBuilder sb, int indent, ParseNode node) {
   for (int x = 0; x < indent; x++) {
     sb.append("  ");
   }
   sb.append("( ");
   sb.append(node.getRule());
   sb.append("\n");
   for (Object child : node._children) {
     if (child instanceof ParseNode) {
       toParseTree(sb, indent + 1, (ParseNode) child);
     } else if (child instanceof Token) {
       Token token = (Token) child;
       if (token.getChannel() != token.HIDDEN_CHANNEL) {
         for (int x = 0; x < indent + 1; x++) {
           sb.append("  ");
         }
         sb.append(token.getType());
         sb.append(":");
         sb.append(token.getText());
         sb.append("\n");
       }
     }
   }
   for (int x = 0; x < indent; x++) {
     sb.append("  ");
   }
   sb.append(")");
   sb.append("\n");
 }
コード例 #2
0
ファイル: ParseNode.java プロジェクト: jasonosgood/fado
  private static void find(
      boolean first,
      ParseNode parent,
      ArrayList<String> query,
      int nth,
      boolean seeking,
      ArrayList<Object> result) {
    String spot = query.get(nth);
    if ("**".equals(spot)) {
      find(first, parent, query, nth + 1, true, result);
    }
    for (Object child : parent._children) {
      boolean wildcard = "*".equals(spot);
      boolean tokenQuery = Character.isUpperCase(spot.charAt(0));
      boolean nodeQuery = Character.isLowerCase(spot.charAt(0));

      if (child instanceof Token && (wildcard || tokenQuery)) {
        Token token = (Token) child;
        int type = getLexType(spot);
        if (token.getType() == type) {
          result.add(token);
        }
      } else if (child instanceof ParseNode && (wildcard || nodeQuery)) {
        ParseNode childNode = (ParseNode) child;
        if (wildcard || childNode.getRule().equals(spot)) {
          if (nth + 1 < query.size()) {
            find(first, childNode, query, nth + 1, false, result);
          } else {
            result.add(childNode);
          }
        }
        //				else
        else if (seeking) {
          find(first, childNode, query, nth, true, result);
        }
      }

      if (first && result.size() > 0) break;
    }
  }