00001 #ifndef TYPE_CHECKER_VISITOR_H 00002 #define TYPE_CHECKER_VISITOR_H 00003 00004 #include "visitor.h" 00005 #include <map> 00006 #include <vector> 00007 #include <string> 00008 00009 using namespace std; 00010 00011 class TypeCheckerVisitor : public Visitor { 00012 private: 00013 map<string, Type*> symbolTable; 00014 bool insert; 00015 bool forgetIt; 00016 vector<Ast*> stack; 00017 00018 public: 00019 virtual ~TypeCheckerVisitor() {} 00020 VisitorReturn *visitAction(Action *action); 00021 VisitorReturn *visitActStatement(ActStatement *actStatement); 00022 VisitorReturn *visitArrayReference(ArrayReference *arrayReference); 00023 VisitorReturn *visitArrayType(ArrayType *arrayType); 00024 VisitorReturn *visitAssignStatement(AssignStatement *assignStatement); 00025 VisitorReturn *visitAst(Ast *ast); 00026 VisitorReturn *visitBehavior(Behavior *behavior); 00027 VisitorReturn *visitBehaviorStatement(BehaviorStatement *behaviorStatement); 00028 VisitorReturn *visitBinaryExpression(BinaryExpression *binaryExpression); 00029 VisitorReturn *visitDeclaration(Declaration *declaration); 00030 VisitorReturn *visitDoStatement(DoStatement *doStatement); 00031 VisitorReturn *visitExpression(Expression *expression); 00032 VisitorReturn *visitExpressionList(ExpressionList *expressionList); 00033 VisitorReturn *visitFieldDeclaration(FieldDeclaration *fieldDeclaration); 00034 VisitorReturn *visitFieldReference(FieldReference *fieldReference); 00035 VisitorReturn *visitFieldType(FieldType *fieldType); 00036 VisitorReturn *visitGuard(Guard *guard); 00037 VisitorReturn *visitGuardedStatement(GuardedStatement *guardedStatement); 00038 VisitorReturn *visitGuardExpression(GuardExpression *guardExpression); 00039 VisitorReturn *visitGuardReceive(GuardReceive *guardReceive); 00040 VisitorReturn *visitGuardTimeout(GuardTimeout *guardTimeout); 00041 VisitorReturn *visitIdentifier(Identifier *identifier); 00042 VisitorReturn *visitIdentifierList(IdentifierList *identifierList); 00043 VisitorReturn *visitIfStatement(IfStatement *ifStatement); 00044 VisitorReturn *visitImport(Import *import); 00045 VisitorReturn *visitLeftSide(LeftSide *leftSide); 00046 VisitorReturn *visitLeftSideList(LeftSideList *leftSideList); 00047 VisitorReturn *visitMessage(Message *message); 00048 VisitorReturn *visitMultipleArrayReference(MultipleArrayReference *multipleArrayReference); 00049 VisitorReturn *visitProcess(Process *process); 00050 VisitorReturn *visitProgram(Program *program); 00051 VisitorReturn *visitRangeType(RangeType *rangeType); 00052 VisitorReturn *visitReceiveStatement(ReceiveStatement *receiveStatement); 00053 VisitorReturn *visitSendStatement(SendStatement *sendStatement); 00054 VisitorReturn *visitSequentialAction(SequentialAction *sequentialAction); 00055 VisitorReturn *visitSequentialBehavior(SequentialBehavior *sequentialBehavior); 00056 VisitorReturn *visitSequentialDeclaration(SequentialDeclaration *sequentialDeclaration); 00057 VisitorReturn *visitSequentialExpressionList(SequentialExpressionList *sequentialExpressionList); 00058 VisitorReturn *visitSequentialFieldDeclaration(SequentialFieldDeclaration *sequentialFieldDeclaration); 00059 VisitorReturn *visitSequentialGuardedStatement(SequentialGuardedStatement *sequentialGuardedStatement); 00060 VisitorReturn *visitSequentialIdentifierList(SequentialIdentifierList *sequentialIdentifierList); 00061 VisitorReturn *visitSequentialImport(SequentialImport *sequentialImport); 00062 VisitorReturn *visitSequentialLeftSideList(SequentialLeftSideList *sequentialLeftSideList); 00063 VisitorReturn *visitSequentialMessage(SequentialMessage *sequentialMessage); 00064 VisitorReturn *visitSequentialProcess(SequentialProcess *sequentialProcess); 00065 VisitorReturn *visitSequentialStatement(SequentialStatement *sequentialStatement); 00066 VisitorReturn *visitSimpleAction(SimpleAction *simpleAction); 00067 VisitorReturn *visitSimpleArrayReference(SimpleArrayReference *simpleArrayReference); 00068 VisitorReturn *visitSimpleBehavior(SimpleBehavior *simpleBehavior); 00069 VisitorReturn *visitSimpleDeclaration(SimpleDeclaration *simpleDeclaration); 00070 VisitorReturn *visitSimpleExpressionList(SimpleExpressionList *simpleExpressionList); 00071 VisitorReturn *visitSimpleFieldDeclaration(SimpleFieldDeclaration *simpleFieldDeclaration); 00072 VisitorReturn *visitSimpleGuardedStatement(SimpleGuardedStatement *simpleGuardedStatement); 00073 VisitorReturn *visitSimpleIdentifierList(SimpleIdentifierList *simpleIdentifierList); 00074 VisitorReturn *visitSimpleImport(SimpleImport *simpleImport); 00075 VisitorReturn *visitSimpleLeftSideList(SimpleLeftSideList *simpleLeftSideList); 00076 VisitorReturn *visitSimpleMessage(SimpleMessage *simpleMessage); 00077 VisitorReturn *visitSimpleProcess(SimpleProcess *simpleProcess); 00078 VisitorReturn *visitSimpleStatement(SimpleStatement *simpleStatement); 00079 VisitorReturn *visitSkipStatement(SkipStatement *skipStatement); 00080 VisitorReturn *visitStartStatement(StartStatement *startStatement); 00081 VisitorReturn *visitStatement(Statement *statement); 00082 VisitorReturn *visitStopStatement(StopStatement *stopStatement); 00083 VisitorReturn *visitStringLiteral(StringLiteral *stringLiteral); 00084 VisitorReturn *visitIntegerLiteral(IntegerLiteral *integerLiteral); 00085 VisitorReturn *visitType(Type *type); 00086 VisitorReturn *visitUnaryExpression(UnaryExpression *unaryExpression); 00087 }; 00088 00089 #endif