00001 // -*- mode: C++; c-file-style: "stroustrup"; c-basic-offset: 4; -*- 00002 00003 /* libutap - Uppaal Timed Automata Parser. 00004 Copyright (C) 2002-2003 Uppsala University and Aalborg University. 00005 00006 This library is free software; you can redistribute it and/or 00007 modify it under the terms of the GNU Lesser General Public License 00008 as published by the Free Software Foundation; either version 2.1 of 00009 the License, or (at your option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, but 00012 WITHOUT ANY WARRANTY; without even the implied warranty of 00013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00014 Lesser General Public License for more details. 00015 00016 You should have received a copy of the GNU Lesser General Public 00017 License along with this library; if not, write to the Free Software 00018 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00019 USA 00020 */ 00021 00022 #ifndef UTAP_TYPECHECKER_HH 00023 #define UTAP_TYPECHECKER_HH 00024 00025 00026 #include <exception> 00027 #include <set> 00028 #include "utap/system.hh" 00029 #include "utap/common.hh" 00030 #include "utap/expression.hh" 00031 #include "utap/statement.hh" 00032 00033 namespace UTAP 00034 { 00035 00042 class PersistentVariables : public SystemVisitor 00043 { 00044 private: 00045 std::set<symbol_t> variables; 00046 public: 00047 virtual void visitVariable(variable_t &); 00048 virtual void visitTemplateAfter(template_t &); 00049 const std::set<symbol_t> &get() const; 00050 }; 00051 00053 class TypeChecker : public ContextVisitor, public StatementVisitor 00054 { 00055 private: 00056 ErrorHandler *errorHandler; 00057 TimedAutomataSystem *system; 00058 PersistentVariables persistentVariables; 00059 00060 void annotate(expression_t expr); 00061 void checkInitialiser(variable_t &var); 00062 void checkInitialiser(type_t type, expression_t init); 00063 bool areAssignmentCompatible(type_t lvalue, type_t rvalue); 00064 bool areInlineIfCompatible(type_t thenArg, type_t elseArg); 00065 bool isInteger(expression_t) const; 00066 bool isClock(expression_t) const; 00067 bool isRecord(expression_t) const; 00068 bool isDiff(expression_t) const; 00069 bool isInvariant(expression_t) const; 00070 bool isGuard(expression_t) const; 00071 bool isConstraint(expression_t) const; 00072 bool isSideEffectFree(expression_t) const; 00073 bool isLHSValue(expression_t) const; 00074 bool isUniqueReference(expression_t expr) const; 00075 void checkRange(expression_t expr); 00076 void checkParameterCompatible(const Interpreter &, 00077 type_t param, expression_t expr); 00078 00080 void checkAssignmentExpressionInFunction(expression_t); 00081 00083 void checkConditionalExpressionInFunction(expression_t); 00084 00086 void checkFunctionCallArguments(expression_t); 00087 00088 void annotateAndExpectConstantInteger(expression_t); 00089 void checkType(type_t); 00090 00092 void checkVariableDeclaration(variable_t &variable); 00093 00094 expression_t makeConstant(int); 00095 type_t typeOfBinaryNonInt(expression_t, uint32_t binaryop, expression_t); 00096 00097 public: 00098 TypeChecker(ErrorHandler *errorHandler); 00099 virtual ~TypeChecker() {} 00100 virtual void visitSystemBefore(TimedAutomataSystem *); 00101 virtual void visitVariable(variable_t &); 00102 virtual void visitConstant(variable_t &); 00103 virtual void visitState(state_t &); 00104 virtual void visitTransition(transition_t &); 00105 virtual void visitInstance(instance_t &); 00106 virtual void visitProperty(expression_t); 00107 virtual void visitFunction(function_t &); 00108 00109 virtual int32_t visitEmptyStatement(EmptyStatement *stat); 00110 virtual int32_t visitExprStatement(ExprStatement *stat); 00111 virtual int32_t visitForStatement(ForStatement *stat); 00112 virtual int32_t visitWhileStatement(WhileStatement *stat); 00113 virtual int32_t visitDoWhileStatement(DoWhileStatement *stat); 00114 virtual int32_t visitBlockStatement(BlockStatement *stat); 00115 virtual int32_t visitSwitchStatement(SwitchStatement *stat); 00116 virtual int32_t visitCaseStatement(CaseStatement *stat); 00117 virtual int32_t visitDefaultStatement(DefaultStatement *stat); 00118 virtual int32_t visitIfStatement(IfStatement *stat); 00119 virtual int32_t visitBreakStatement(BreakStatement *stat); 00120 virtual int32_t visitContinueStatement(ContinueStatement *stat); 00121 virtual int32_t visitReturnStatement(ReturnStatement *stat); 00122 00123 }; 00124 } 00125 00126 #endif