+ 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
+{
+ CYStatement *statements_;
+
+ CYProgram(CYStatement *statements) :
+ statements_(statements)
+ {
+ }
+
+ virtual void Replace(CYContext &context);
+ virtual void Output(CYOutput &out) const;
+};
+
+struct CYContext {
+ apr_pool_t *pool_;
+ CYOptions &options_;
+ CYScope *scope_;
+ CYIdentifierUsageVector rename_;
+
+ CYContext(apr_pool_t *pool, CYOptions &options) :
+ pool_(pool),
+ options_(options),
+ scope_(NULL)
+ {
+ }
+
+ virtual ~CYContext() {
+ }
+
+ template <typename Type_>
+ void Replace(Type_ *&value) {
+ for (;;) if (value == NULL)
+ break;
+ else {
+ Type_ *replace(value->Replace(*this));
+ if (replace != value)
+ value = replace;
+ else break;
+ }
+ }