Semantic checks for tasks...Made the TaskDescriptor inherit from the MethodDescriptor.
authorbdemsky <bdemsky>
Mon, 15 May 2006 23:49:49 +0000 (23:49 +0000)
committerbdemsky <bdemsky>
Mon, 15 May 2006 23:49:49 +0000 (23:49 +0000)
Robust/src/IR/ClassDescriptor.java
Robust/src/IR/MethodDescriptor.java
Robust/src/IR/State.java
Robust/src/IR/TaskDescriptor.java
Robust/src/IR/Tree/FlagEffect.java
Robust/src/IR/Tree/FlagEffects.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/IR/Tree/TaskExitNode.java
Robust/src/Makefile

index 504d026d818743121f04a31993f9c49837ac5468..d977805e4a1e68fe79f1472fe5f00bc02cfe3631 100644 (file)
@@ -5,15 +5,14 @@ import IR.Tree.*;
 public class ClassDescriptor extends Descriptor {
     public ClassDescriptor(String classname) {
        super(classname);
-       this.classname=classname;
        superclass=null;
+       flags=new SymbolTable();
        fields=new SymbolTable();
        methods=new SymbolTable();
        classid=UIDCount++;
     }
     private static int UIDCount=0; 
     private final int classid;
-    String classname;
     String superclass;
     ClassDescriptor superdesc;
 
@@ -57,7 +56,7 @@ public class ClassDescriptor extends Descriptor {
 
     public String printTree(State state) {
        int indent;
-       String st=modifiers.toString()+"class "+classname;
+       String st=modifiers.toString()+"class "+getSymbol();
        if (superclass!=null) 
            st+="extends "+superclass.toString();
        st+=" {\n";
@@ -112,10 +111,6 @@ public class ClassDescriptor extends Descriptor {
        this.modifiers=modifiers;
     }
 
-    public void setName(String name) {
-       classname=name;
-    }
-
     public void setSuper(String superclass) {
        this.superclass=superclass;
     }
index 195d707688900d21abf1785969d97e10c2e9749d..a9a366588724f10d5c8254a715a2c8b348bdc5e0 100644 (file)
@@ -21,7 +21,7 @@ public class MethodDescriptor extends Descriptor {
 
 
     public MethodDescriptor(Modifiers m, TypeDescriptor rt, String identifier) {
-       super(identifier);
+       this(identifier);
        this.modifier=m;
        this.returntype=rt;
        this.identifier=identifier;
@@ -32,6 +32,9 @@ public class MethodDescriptor extends Descriptor {
        thisvd=null;
     }
 
+    protected MethodDescriptor(String s) {
+       super(s);
+    }
 
     public Modifiers getModifiers() {
        return modifier;
@@ -53,7 +56,7 @@ public class MethodDescriptor extends Descriptor {
     }
 
     public MethodDescriptor(Modifiers m, String identifier) {
-       super(identifier);
+       this(identifier);
        this.modifier=m;
        this.returntype=null;
        this.identifier=identifier;
index b25453929608cfc85b7da0865a0e3e99396783b7..06666e204123c4c1d117e082141c45283b24d120 100644 (file)
@@ -76,6 +76,10 @@ public class State {
        return (BlockNode)treemethodmap.get(md);
     }
 
+    public BlockNode getMethodBody(TaskDescriptor td) {
+       return (BlockNode)treemethodmap.get(td);
+    }
+
     public SymbolTable getClassSymbolTable() {
        return classes;
     }
index 47a92909fb4b6f41af38c67d40e2c1fa178845cf..243e8fef299a7aab6de488f9ee56e4ffafea0e88 100644 (file)
@@ -3,18 +3,15 @@ import IR.Tree.FlagExpressionNode;
 import IR.Tree.FlagEffects;
 import java.util.Vector;
 import java.util.Hashtable;
+import IR.Tree.Modifiers;
 
 /**
  * Descriptor 
  *
  */
 
-public class TaskDescriptor extends Descriptor {
+public class TaskDescriptor extends MethodDescriptor {
 
-    protected String identifier;
-    protected Vector params;
-    protected SymbolTable paramtable;
-    protected VarDescriptor thisvd;
     protected Hashtable flagstable;
     protected Vector vfe;
 
@@ -25,25 +22,45 @@ public class TaskDescriptor extends Descriptor {
        flagstable=new Hashtable();
        params=new Vector();
        paramtable=new SymbolTable();
-       thisvd=null;
     }
 
     public void addFlagEffects(Vector vfe) {
        this.vfe=vfe;
     }
 
-    public String getSafeMethodDescriptor() {
-       String st="";
-       for(int i=0;i<numParameters();i++) {
-           st+=getParamType(i).getSafeDescriptor();
-           if ((i+1)<numParameters())
-               st+="_";
-       }
-       return st;
+    public Vector getFlagEffects() {
+       return vfe;
     }
 
-    public SymbolTable getParameterTable() {
-       return paramtable;
+    public Modifiers getModifiers() {
+       throw new Error();
+    }
+    public boolean matches(MethodDescriptor md) {
+       throw new Error();
+    }
+    public void setThis(VarDescriptor vd) {
+       throw new Error();
+    }
+    public VarDescriptor getThis() {
+       throw new Error();
+    }
+    public String getSafeMethodDescriptor() {
+       throw new Error();
+    }
+    public boolean isStatic() {
+       throw new Error();
+    }
+    public boolean isConstructor() {
+       throw new Error();
+    }
+    public TypeDescriptor getReturnType() {
+       throw new Error();
+    }
+    public void setClassDesc(ClassDescriptor cd) {
+       throw new Error();
+    }
+    public ClassDescriptor getClassDesc() {
+       throw new Error();
     }
 
     public void addParameter(TypeDescriptor type, String paramname, FlagExpressionNode fen) {
@@ -62,22 +79,6 @@ public class TaskDescriptor extends Descriptor {
        return (FlagExpressionNode) flagstable.get(vd);
     }
 
-    public int numParameters() {
-       return params.size();
-    }
-
-    public VarDescriptor getParameter(int i) {
-       return (VarDescriptor)params.get(i);
-    }
-
-    public String getParamName(int i) {
-       return ((VarDescriptor)params.get(i)).getName();
-    }
-
-    public TypeDescriptor getParamType(int i) {
-       return ((VarDescriptor)params.get(i)).getType();
-    }
-
     public String toString() {
        String st=identifier+"(";
        for(int i=0;i<params.size();i++) {
index a468435e09e8902635a1002c4d68b9d6c187d642..78769103ab2e0b8e175a9698fafd1011a11fe926 100644 (file)
@@ -20,6 +20,10 @@ public class FlagEffect {
        return flag;
     }
 
+    public String getName() {
+       return name;
+    }
+
     public int kind() {
        return Kind.FlagNode;
     }
index d92246111f02cb8bf40f342c97f365c6c6895798..443840859f69b78928e7d887a5dc8e3521fad279 100644 (file)
@@ -6,16 +6,37 @@ import java.util.*;
 public class FlagEffects {
     Vector effects;
     String name;
+    VarDescriptor vd;
 
     public FlagEffects(String name) {
        effects=new Vector();
        this.name=name;
     }
 
+    public void setVar(VarDescriptor vd) {
+       this.vd=vd;
+    }
+
+    public VarDescriptor getVar() {
+       return vd;
+    }
+
+    public String getName() {
+       return name;
+    }
+
     public void addEffect(FlagEffect fe) {
        effects.add(fe);
     }
 
+    public int numEffects() {
+       return effects.size();
+    }
+
+    public FlagEffect getEffect(int i) {
+       return (FlagEffect) effects.get(i);
+    }
+
     public String printNode(int indent) {
        String st=name+"(";
        for(int i=0;i<effects.size();i++) {
index 561c9021422524b46e6e7c0da455a4beb5223e47..c5a57f151a54609496c1a71b38f8aee281479343 100644 (file)
@@ -54,7 +54,7 @@ public class SemanticCheck {
 
        for(Iterator task_it=state.getTaskSymbolTable().getDescriptorsIterator();task_it.hasNext();) {
            TaskDescriptor td=(TaskDescriptor)task_it.next();
-           
+           checkTask(td);
            
        }
 
@@ -78,6 +78,34 @@ public class SemanticCheck {
        checkTypeDescriptor(fd.getType());
     }
 
+    public void checkFlagEffects(TaskDescriptor td, Vector vfe) {
+       for(int i=0;i<vfe.size();i++) {
+           FlagEffects fe=(FlagEffects) vfe.get(i);
+           String varname=fe.getName();
+           //Make sure the variable is declared as a parameter to the task
+           VarDescriptor vd=(VarDescriptor)td.getParameterTable().get(varname);
+           if (vd==null)
+               throw new Error("Parameter "+varname+" in Flag Effects not declared");
+           fe.setVar(vd);
+
+           //Make sure it correspods to a class
+           TypeDescriptor type_d=vd.getType();
+           if (!type_d.isClass())
+               throw new Error("Cannot have non-object argument for flag_effect");
+
+           ClassDescriptor cd=type_d.getClassDesc();
+           for(int j=0;j<fe.numEffects();j++) {
+               FlagEffect flag=fe.getEffect(j);
+               String name=flag.getName();
+               FlagDescriptor flag_d=(FlagDescriptor)cd.getFlagTable().get(name);
+               //Make sure the flag is declared
+               if (flag_d==null)
+                   throw new Error("Flag descriptor "+name+" undefined in class: "+cd.getSymbol());
+               flag.setFlag(flag_d);
+           }
+       }
+    }
+
     public void checkTask(TaskDescriptor td) {
        for(int i=0;i<td.numParameters();i++) {
            /* Check that parameter is well typed */
@@ -90,6 +118,11 @@ public class SemanticCheck {
                throw new Error("Cannot have non-object argument to a task");
            ClassDescriptor cd=param_type.getClassDesc();
            checkFlagExpressionNode(cd, fen);
+           checkFlagEffects(td, td.getFlagEffects());
+
+           /* Check that the task code is valid */
+           BlockNode bn=state.getMethodBody(td);
+           checkBlockNode(td, td.getParameterTable(),bn);
        }
     }
 
@@ -175,6 +208,10 @@ public class SemanticCheck {
            checkReturnNode(md, nametable, (ReturnNode)bsn);
            return;
 
+       case Kind.TaskExitNode:
+           checkTaskExitNode(md, nametable, (TaskExitNode)bsn);
+           return;
+
        case Kind.SubBlockNode:
            checkSubBlockNode(md, nametable, (SubBlockNode)bsn);
            return;
@@ -204,6 +241,8 @@ public class SemanticCheck {
     }
 
     void checkReturnNode(MethodDescriptor md, SymbolTable nametable, ReturnNode rn) {
+       if (md instanceof TaskDescriptor)
+           throw new Error("Illegal return appears in Task: "+md.getSymbol());
        if (rn.getReturnExpression()!=null)
            checkExpressionNode(md, nametable, rn.getReturnExpression(), md.getReturnType());
        else
@@ -211,6 +250,12 @@ public class SemanticCheck {
                throw new Error("Need to return something for "+md);
     }
 
+    void checkTaskExitNode(MethodDescriptor md, SymbolTable nametable, TaskExitNode ten) {
+       if (!(md instanceof TaskDescriptor))
+           throw new Error("Illegal taskexit appears in Method: "+md.getSymbol());
+       checkFlagEffects((TaskDescriptor)md, ten.getFlagEffects());
+    }
+
     void checkIfStatementNode(MethodDescriptor md, SymbolTable nametable, IfStatementNode isn) {
        checkExpressionNode(md, nametable, isn.getCondition(), new TypeDescriptor(TypeDescriptor.BOOLEAN));
        checkBlockNode(md, nametable, isn.getTrueBlock());
@@ -507,8 +552,11 @@ public class SemanticCheck {
                    throw new Error(min.getBaseName()+" undefined");
                typetolookin=new TypeDescriptor(cd);
            }
-       } else {
+       } else if (!(md instanceof TaskDescriptor)) {
            typetolookin=new TypeDescriptor(md.getClassDesc());
+       } else {
+           /* If this a task descriptor we throw an error at this point */
+           throw new Error("Unknown method call to "+min.getMethodName()+"in task"+md.getSymbol());
        }
        if (!typetolookin.isClass()) 
            throw new Error();
index 5a2b20f9cde3b24a8cf97deda96fe95e0b8a9636..30f2640e044589cb65ea6c83c5f3c8956df428cb 100644 (file)
@@ -11,6 +11,10 @@ public class TaskExitNode extends BlockStatementNode {
        return "taskexit";
     }
 
+    public Vector getFlagEffects() {
+       return vfe;
+    }
+
     public int kind() {
        return Kind.TaskExitNode;
     }
index fd0f844f5060390fed07160fd761b64fe5d76dc4..8bb5f886797a203985394a42a422ef13606be3ca 100644 (file)
@@ -1,20 +1,35 @@
-CLASSFILES=Main/Main.class IR/AssignOperation.class IR/Descriptor.class        \
-IR/FieldDescriptor.class IR/MethodDescriptor.class                     \
-IR/NameDescriptor.class IR/Operation.class IR/State.class              \
-IR/SymbolTable.class IR/Tree/AssignmentNode.class                      \
+CLASSFILES= Main/Main.class IR/AssignOperation.class                   \
+IR/ClassDescriptor.class IR/Descriptor.class IR/FieldDescriptor.class  \
+IR/FlagDescriptor.class IR/Flat/BuildCode.class                                \
+IR/Flat/BuildFlat.class IR/Flat/FKind.class IR/Flat/FlatCall.class     \
+IR/Flat/FlatCastNode.class IR/Flat/FlatCondBranch.class                        \
+IR/Flat/FlatElementNode.class IR/Flat/FlatFieldNode.class              \
+IR/Flat/FlatLiteralNode.class IR/Flat/FlatMethod.class                 \
+IR/Flat/FlatNew.class IR/Flat/FlatNode.class IR/Flat/FlatNop.class     \
+IR/Flat/FlatOpNode.class IR/Flat/FlatReturnNode.class                  \
+IR/Flat/FlatSetElementNode.class IR/Flat/FlatSetFieldNode.class                \
+IR/Flat/NodePair.class IR/Flat/ParamsObject.class                      \
+IR/Flat/TempDescriptor.class IR/Flat/TempObject.class                  \
+IR/MethodDescriptor.class IR/NameDescriptor.class IR/Operation.class   \
+IR/State.class IR/SymbolTable.class IR/TaskDescriptor.class            \
+IR/Tree/ArrayAccessNode.class IR/Tree/AssignmentNode.class             \
 IR/Tree/BlockExpressionNode.class IR/Tree/BlockNode.class              \
 IR/Tree/BlockStatementNode.class IR/Tree/BuildIR.class                 \
 IR/Tree/CastNode.class IR/Tree/CreateObjectNode.class                  \
 IR/Tree/DeclarationNode.class IR/Tree/ExpressionNode.class             \
-IR/Tree/FieldAccessNode.class IR/Tree/IfStatementNode.class            \
+IR/Tree/FieldAccessNode.class IR/Tree/FlagEffect.class                 \
+IR/Tree/FlagEffects.class IR/Tree/FlagExpressionNode.class             \
+IR/Tree/FlagNode.class IR/Tree/FlagOpNode.class                                \
+IR/Tree/IfStatementNode.class IR/Tree/Kind.class                       \
 IR/Tree/LiteralNode.class IR/Tree/LoopNode.class                       \
 IR/Tree/MethodInvokeNode.class IR/Tree/Modifiers.class                 \
 IR/Tree/NameNode.class IR/Tree/OpNode.class IR/Tree/ParseNode.class    \
 IR/Tree/ParseNodeDOTVisitor.class IR/Tree/ParseNodeVector.class                \
-IR/Tree/ReturnNode.class IR/Tree/SubBlockNode.class                    \
+IR/Tree/ReturnNode.class IR/Tree/SemanticCheck.class                   \
+IR/Tree/SubBlockNode.class IR/Tree/TaskExitNode.class                  \
 IR/Tree/TreeNode.class IR/Tree/Walkable.class IR/TypeDescriptor.class  \
-IR/VarDescriptor.class Lex/BooleanLiteral.class                                \
-Lex/CharacterLiteral.class Lex/Comment.class                           \
+IR/TypeUtil.class IR/VarDescriptor.class IR/Virtual.class              \
+Lex/BooleanLiteral.class Lex/CharacterLiteral.class Lex/Comment.class  \
 Lex/DocumentationComment.class Lex/DoubleLiteral.class                 \
 Lex/EndOfLineComment.class Lex/EOF.class                               \
 Lex/EscapedUnicodeReader.class Lex/FIFO.class Lex/FloatLiteral.class   \