Skip to content
Snippets Groups Projects
Signature.jrag 4.64 KiB
Newer Older
  • Learn to ignore specific revisions
  • Anders Nilsson's avatar
    Anders Nilsson committed
    import java.util.*;
    
    aspect Signature {  
    
      public class SignatureLine {
      
        private int indent;
        private byte[] data;
        private String comment;
    
        public SignatureLine(int indent, byte[] data, String comment) {
          this.indent = indent;
          this.data = data;
          this.comment = comment;
        }
    
        public int getIndent() {
          return indent;
        }
    
        public byte[] getData() {
          return data;
        }
    
        public String getComment() {
          return comment;
        }
    
      }
    
      public class SignatureList {
    
        private int indent;
        private ArrayList list = new ArrayList();
        
        public void add(byte[] data, String comment) {
          list.add(new SignatureLine(indent, data, comment));
        }
    
        public void addInt(int value, String comment) {
          byte[] data = new byte[4];
          for (int i = 0 ; i < 4 ; i++) {
            data[3 - i] = (byte)((value >> (8 * i)) & 0xff);
          }
          add(data, comment);
        }
    
        public void addString(String value, String comment) {
          addInt(value.length(), comment);
          byte[] data = new byte[value.length()];
          for (int i = 0 ; i < value.length() ; i++) {
            data[i] = (byte)(value.charAt(i) & 0xff);
          }
          add(data, null);
        }
    
        public int size() {
          return list.size();
        }
    
        public String getIndent(int i) {
          StringBuffer result = new StringBuffer();
          int indent = ((SignatureLine)list.get(i)).getIndent();
          for (i = 0 ; i < indent ; i++) {
            result.append("  ");
          }
          return result.toString();
        }
    
        public byte[] getData(int i) {
          return ((SignatureLine)list.get(i)).getData();
        }
    
        public String getComment(int i) {
          return ((SignatureLine)list.get(i)).getComment();
        }
    
        public void indent() {
          indent++;
        }
    
        public void unindent() {
          indent--;
        }
    
      }
    
      public SignatureList Decl.signature() {
        SignatureList result = new SignatureList();
        flatSignature(result);
        return result;
      }
    
      public void ASTNode.flatSignature(SignatureList list) {
        throw new Error(this.getClass().getName() + 
                        ".flatSignature(SignatureList list)" + 
                        " not declared");
      }
    
      public void TypeDecl.flatSignature(SignatureList list) {
        getType().flatSignature(list);
      }
    
      public void SampleDecl.flatSignature(SignatureList list) {
        getType().flatSignature(list);
      }
    
      public void VoidType.flatSignature(SignatureList list) {
        list.addInt(LABCOMM_STRUCT, "void");
        list.addInt(0, null);
      }
    
      public void PrimType.flatSignature(SignatureList list) {
        list.addInt(getToken(), null);
      }
    
      public void UserType.flatSignature(SignatureList list) {
        lookupType(getName()).flatSignature(list);
      }
    
      public void ArrayType.flatSignature(SignatureList list) {
        list.addInt(LABCOMM_ARRAY, signatureComment());
        list.indent();
        list.addInt(getNumExp(), null);
        for (int i = 0 ; i < getNumExp() ; i++) {
          getExp(i).flatSignature(list);
        }
        getType().flatSignature(list);
        list.unindent();
        list.add(null, "}");
      }
    
      public void StructType.flatSignature(SignatureList list) {
        list.addInt(LABCOMM_STRUCT, "struct { " + getNumField() + " fields");
        list.indent();
        list.addInt(getNumField(), null);
        for (int i = 0 ; i < getNumField() ; i++) {
          getField(i).flatSignature(list);
        }
        list.unindent();
        list.add(null, "}");
      }
    
      public void Field.flatSignature(SignatureList list) {
        list.addString(getName(), signatureComment());
        getType().flatSignature(list);
      }
    
      public void IntegerLiteral.flatSignature(SignatureList list) {
        list.addInt(Integer.parseInt(getValue()), null);
      }
    
      public void VariableSize.flatSignature(SignatureList list) {
        list.addInt(0, null);
      }
    
      public String ArrayType.signatureComment() {
        StringBuffer result = new StringBuffer("array [");
        for (int i = 0 ; i < getNumExp() ; i++) {
          if (i > 0) {
    	result.append(", ");
          }
          result.append(getExp(i).signatureComment());
        }
        result.append("]");
        return result.toString();
      }
    
      public String ASTNode.signatureComment() {
        throw new Error(this.getClass().getName() + 
                        ".signatureComment()" + 
                        " not declared");
      }
    
      public String Field.signatureComment() {
        return getType().signatureComment() + " '" + getName() +"'";
      }
    
      public String PrimType.signatureComment() {
        return getName();
      }
    
      public String UserType.signatureComment() {
        return getName();
      }
    
      public String StructType.signatureComment() {
        return "struct";
      }
    
      public String IntegerLiteral.signatureComment() {
        return getValue();
      }
    
      public String VariableSize.signatureComment() {
        return "_";
      }
    
    }