+ CYStatement
+{
+ CYIdentifier *name_;
+ CYStatement *statement_;
+
+ CYLabel(CYIdentifier *name, CYStatement *statement) :
+ name_(name),
+ statement_(statement)
+ {
+ }
+
+ virtual CYStatement *Replace(CYContext &context);
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
+struct CYCStringLess :
+ std::binary_function<const char *, const char *, bool>
+{
+ _finline bool operator ()(const char *lhs, const char *rhs) const {
+ return strcmp(lhs, rhs) < 0;
+ }
+};
+
+struct CYIdentifierValueLess :
+ std::binary_function<CYIdentifier *, CYIdentifier *, bool>
+{
+ _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const {
+ return CYCStringLess()(lhs->Word(), rhs->Word());
+ }
+};
+
+enum CYIdentifierFlags {
+ CYIdentifierArgument,
+ CYIdentifierVariable,
+ CYIdentifierOther,
+ CYIdentifierMagic,
+ CYIdentifierCatch,
+};
+
+typedef std::set<const char *, CYCStringLess> CYCStringSet;
+typedef std::set<CYIdentifier *, CYIdentifierValueLess> CYIdentifierValueSet;
+typedef std::map<CYIdentifier *, CYIdentifierFlags> CYIdentifierAddressFlagsMap;
+
+struct CYIdentifierUsage {
+ CYIdentifier *identifier_;
+ size_t usage_;
+};
+
+typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
+
+struct CYScope {
+ bool transparent_;
+
+ CYContext &context_;
+ CYStatement *&statements_;
+
+ CYScope *parent_;
+
+ CYIdentifierAddressFlagsMap internal_;
+ CYIdentifierValueSet identifiers_;
+
+ CYScope(bool transparent, CYContext &context, CYStatement *&statements);
+ virtual ~CYScope();
+
+ void Close();
+
+ void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
+ virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
+ void Merge(CYContext &context, CYIdentifier *identifier);
+ void Scope(CYContext &context, CYStatement *&statements);
+};
+
+struct CYProgram :
+ CYThing