X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/14ec9e00ac4903521e92002604eb56ed7cde036d..c30687a7155e8c96310eaddd8213f6d3a69cab0e:/Parser.hpp?ds=inline diff --git a/Parser.hpp b/Parser.hpp index dd9263e..f48e81b 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -50,6 +50,7 @@ #include #include +#include #include #include "location.hh" @@ -243,10 +244,14 @@ struct CYIdentifier : CYWord { CYIdentifier *replace_; + size_t offset_; + size_t usage_; CYIdentifier(const char *word) : CYWord(word), - replace_(NULL) + replace_(NULL), + offset_(0), + usage_(0) { } @@ -309,33 +314,39 @@ enum CYIdentifierFlags { typedef std::set CYCStringSet; typedef std::set CYIdentifierValueSet; -typedef std::set CYIdentifierAddressSet; -typedef std::vector CYIdentifierAddressVector; typedef std::map CYIdentifierAddressFlagsMap; +struct CYIdentifierUsage { + CYIdentifier *identifier_; + size_t usage_; +}; + +typedef std::vector CYIdentifierUsageVector; + struct CYScope { CYScope *parent_; - CYIdentifierValueSet identifiers_; + CYIdentifierAddressFlagsMap internal_; - size_t offset_; + CYIdentifierValueSet identifiers_; CYScope() : - parent_(NULL), - offset_(0) + parent_(NULL) { } - void Add(CYContext &context, CYIdentifierAddressVector &external); + virtual ~CYScope() { + } + + 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 : - CYScope, CYThing { CYStatement *statements_; - CYIdentifierAddressVector rename_; - CYCStringSet external_; CYProgram(CYStatement *statements) : statements_(statements) @@ -346,16 +357,43 @@ struct CYProgram : 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 + void Replace(Type_ *&value) { + for (;;) if (value == NULL) + break; + else { + Type_ *replace(value->Replace(*this)); + if (replace != value) + value = replace; + else break; + } + } +}; + struct CYBlock : CYStatement, CYThing { CYStatement *statements_; - CYScope *scope_; - CYBlock(CYStatement *statements, CYScope *scope = NULL) : - statements_(statements), - scope_(scope) + CYBlock(CYStatement *statements) : + statements_(statements) { } @@ -1328,9 +1366,7 @@ struct CYWhile : virtual void Output(CYOutput &out, CYFlags flags) const; }; -struct CYFunction : - CYScope -{ +struct CYFunction { CYIdentifier *name_; CYFunctionParameter *parameters_; CYBlock code_; @@ -1338,7 +1374,7 @@ struct CYFunction : CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) : name_(name), parameters_(parameters), - code_(statements, this) + code_(statements) { }