1 #ifndef AST_TYPE_CHECKER_VISITOR_HH
2 # define AST_TYPE_CHECKER_VISITOR_HH
7 # include <ast/browse-visitor.hh>
11 /// @defgroup Visitors
13 * @brief Check that all expressions are correct (type)
16 class TypeCheckerVisitor
: public BrowseVisitor
20 virtual ~TypeCheckerVisitor();
22 virtual void visit(AssignExp
& node
);
24 virtual void visit(AddExp
& node
);
25 virtual void visit(SubExp
& node
);
26 virtual void visit(MulExp
& node
);
27 virtual void visit(DivExp
& node
);
28 virtual void visit(ModExp
& node
);
30 virtual void visit(AndExp
& node
);
31 virtual void visit(OrExp
& node
);
32 virtual void visit(XorExp
& node
);
34 virtual void visit(ShlExp
& node
);
35 virtual void visit(AShrExp
& node
);
36 virtual void visit(LShrExp
& node
);
38 virtual void visit(EqExp
& node
);
39 virtual void visit(NeqExp
& node
);
40 virtual void visit(LtExp
& node
);
41 virtual void visit(LtEqExp
& node
);
42 virtual void visit(GtExp
& node
);
43 virtual void visit(GtEqExp
& node
);
45 virtual void visit(IdExp
& node
);
46 virtual void visit(CastExp
& node
);
48 virtual void visit(Symbol
& node
);
50 virtual void visit(File
& node
);
51 virtual void visit(Block
& node
);
54 /// @todo move the cast part in an other place
55 typedef std::pair
<id_t
, id_t
> castTableKey_t
;
56 typedef CastExp
* (*castTableValue_t
)(Type
* type1
, Type
* type2
);
57 typedef std::map
<castTableKey_t
, castTableValue_t
> castTable_t
;
58 typedef BrowseVisitor super_t
;
60 static CastExp
* findCast(Type
* type1
, Type
* type2
);
63 static CastExp
* castBoolBool(Type
* type1
, Type
* type2
);
64 static CastExp
* castIntegerFloat(Type
* type1
, Type
* type2
);
65 static CastExp
* castIntegerInteger(Type
* type1
, Type
* type2
);
67 static castTable_t castTable_
;
72 #endif /* !AST_TYPE_CHECKER_VISITOR_HH */