#include "Parser.hpp"
+struct CYTypeModifier :
+ CYNext<CYTypeModifier>
+{
+ CYTypeModifier(CYTypeModifier *next) :
+ CYNext<CYTypeModifier>(next)
+ {
+ }
+
+ virtual CYExpression *Replace(CYContext &context) = 0;
+};
+
+struct CYTypeArrayOf :
+ CYTypeModifier
+{
+ size_t size_;
+
+ CYTypeArrayOf(size_t size, CYTypeModifier *next = NULL) :
+ CYTypeModifier(next),
+ size_(size)
+ {
+ }
+
+ CYPrecedence(2)
+
+ virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypeConstant :
+ CYTypeModifier
+{
+ CYTypeConstant(CYTypeModifier *next = NULL) :
+ CYTypeModifier(next)
+ {
+ }
+
+ CYPrecedence(3)
+
+ virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypePointerTo :
+ CYTypeModifier
+{
+ CYTypePointerTo(CYTypeModifier *next = NULL) :
+ CYTypeModifier(next)
+ {
+ }
+
+ CYPrecedence(3)
+
+ virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypeVariable :
+ CYTypeModifier
+{
+ CYExpression *expression_;
+
+ CYTypeVariable(CYExpression *expression) :
+ CYTypeModifier(NULL),
+ expression_(expression)
+ {
+ }
+
+ CYPrecedence(1)
+
+ virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypedIdentifier :
+ CYNext<CYTypedIdentifier>
+{
+ CYIdentifier *identifier_;
+ CYTypeModifier *type_;
+
+ CYTypedIdentifier(CYIdentifier *identifier) :
+ identifier_(identifier),
+ type_(NULL)
+ {
+ }
+};
+
+struct CYEncodedType :
+ CYExpression
+{
+ CYTypeModifier *type_;
+
+ CYEncodedType(CYTypeModifier *type) :
+ type_(type)
+ {
+ }
+
+ CYPrecedence(1)
+
+ virtual CYExpression *Replace(CYContext &context);
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
struct CYBox :
CYExpression
{