void add_info(Node &, const std::string &);
};
-class TypeValidator: private Validator
+class DeclarationValidator: private Validator
{
private:
- bool in_struct;
+ enum ScopeType
+ {
+ GLOBAL,
+ STRUCT,
+ INTERFACE_BLOCK,
+ FUNCTION_PARAM,
+ FUNCTION
+ };
+
+ ScopeType scope;
+ InterfaceLayout *iface_layout;
+ InterfaceBlock *iface_block;
+ VariableDeclaration *variable;
public:
- TypeValidator();
+ DeclarationValidator();
void apply(Stage &s) { stage = &s; s.content.visit(*this); }
private:
+ static const char *describe_variable(ScopeType);
+
+ virtual void visit(Layout &);
+ virtual void visit(InterfaceLayout &);
virtual void visit(BasicTypeDeclaration &);
virtual void visit(ImageTypeDeclaration &);
virtual void visit(StructDeclaration &);
virtual void visit(VariableDeclaration &);
+ virtual void visit(InterfaceBlock &);
+ virtual void visit(FunctionDeclaration &);
};
-class DeclarationValidator: private Validator
+class IdentifierValidator: private Validator
{
private:
typedef std::map<std::string, Statement *> BlockDeclarationMap;
bool anonymous_block;
public:
- DeclarationValidator();
+ IdentifierValidator();
void apply(Stage &s) { stage = &s; s.content.visit(*this); }
class ExpressionValidator: private Validator
{
+private:
+ FunctionDeclaration *current_function;
+
public:
+ ExpressionValidator();
+
void apply(Stage &s) { stage = &s; s.content.visit(*this); }
private:
virtual void visit(UnaryExpression &);
virtual void visit(BinaryExpression &);
virtual void visit(Assignment &);
+ virtual void visit(TernaryExpression &);
virtual void visit(VariableDeclaration &);
+ virtual void visit(FunctionDeclaration &);
+ virtual void visit(Return &);
};
} // namespace SL