Skip to content
Snippets Groups Projects
PrettyPrint.jrag 2.55 KiB
Newer Older
  • Learn to ignore specific revisions
  • Anders Nilsson's avatar
    Anders Nilsson committed
    import java.io.PrintStream;
    
    aspect PPIndentation {
    
      inh String Exp.pp_indent();
      inh String Field.pp_indent();
      inh String StructType.pp_indent();
      eq StructType.getField(int index).pp_indent() = pp_indent() + "  ";
      eq Program.getDecl(int index).pp_indent() = "";
      
    }
    
    aspect PrettyPrint {
      
      public void ASTNode.pp(PrintStream out) {
        throw new Error(this.getClass().getName() + 
    		    ".pp(PrintStream out)" + 
    		    " not declared");
      }
    
      public void Program.pp(PrintStream out) {
        for(int i = 0; i < getNumDecl(); i++) {
        	getDecl(i).pp(out);
        }
      }
    
       // Pretty print declarations
      public void TypeDecl.pp(PrintStream out) {
        out.print("typedef ");
        getType().ppIdentifier(out, getName());
        out.println(";");
      }
    
      public void SampleDecl.pp(PrintStream out) {
        out.print("sample ");
        getType().ppIdentifier(out, getName());
        out.println(";");
      }
    
      public void Field.pp(PrintStream out) {
        out.print(pp_indent());
        getType().ppIdentifier(out, getName());
        out.println(";");
      }
    
      // Pretty print variable of a given type 
      public void Type.ppIdentifier(PrintStream out, String id) { 
        ppPrefix(out);
        out.print(" ");
        out.print(id);
      }
    
      public void ArrayType.ppIdentifier(PrintStream out, String id) {
        ppPrefix(out);
        out.print(" ");
        out.print(id);
        ppSuffix(out);
      }
    
      // PrettyPrint prefix type info
      public void Type.ppPrefix(PrintStream out) {
        throw new Error(this.getClass().getName() + 
    		    ".ppPrefix(PrintStream out)" + 
    		    " not declared");
      }
    
      public void VoidType.ppPrefix(PrintStream out) { 
        out.print("void");
      }
    
      public void PrimType.ppPrefix(PrintStream out) { 
        out.print(getName());
      }
    
      public void UserType.ppPrefix(PrintStream out) { 
        out.print(getName());
      }
    
      public void ArrayType.ppPrefix(PrintStream out) {
        getType().ppPrefix(out);
      }
    
      public void StructType.ppPrefix(PrintStream out) {
        out.println("struct {");
        for (int i = 0 ; i < getNumField() ; i++) {
          getField(i).pp(out);
        }
        out.print(pp_indent());
        out.print("}");
      }
    
      // PrettyPrint suffix type info (array dimensions)
      public void Type.ppSuffix(PrintStream out) { }
    
      public void ArrayType.ppSuffix(PrintStream out) { 
        out.print("[");
        for (int i = 0 ; i < getNumExp() ; i++) {
          if (i > 0) { out.print(", "); }
          getExp(i).pp(out);
        }
        out.print("]");
        getType().ppSuffix(out);
      }
    
      public void IntegerLiteral.pp(PrintStream out) {
        out.print(getValue());
      }
    
      public void VariableSize.pp(PrintStream out) {
        out.print("_");
      }
    
    }