X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/029bc65b46de676c6733fff684000c7363eda512..6c093cce11bcc8875e4459b3670811227e8dafa7:/Parser.hpp diff --git a/Parser.hpp b/Parser.hpp index dc3c907..49e0722 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -50,6 +50,7 @@ #include #include +#include #include #include "location.hh" @@ -239,13 +240,18 @@ _finline std::ostream &operator <<(std::ostream &lhs, const CYWord &rhs) { } struct CYIdentifier : + CYNext, CYWord { CYIdentifier *replace_; + size_t offset_; + size_t usage_; CYIdentifier(const char *word) : CYWord(word), - replace_(NULL) + replace_(NULL), + offset_(0), + usage_(0) { } @@ -283,7 +289,7 @@ struct CYLabel : virtual void Output(CYOutput &out, CYFlags flags) const; }; -struct CStringLess : +struct CYCStringLess : std::binary_function { _finline bool operator ()(const char *lhs, const char *rhs) const { @@ -295,38 +301,49 @@ struct CYIdentifierValueLess : std::binary_function { _finline bool operator ()(CYIdentifier *lhs, CYIdentifier *rhs) const { - return CStringLess()(lhs->Word(), rhs->Word()); + return CYCStringLess()(lhs->Word(), rhs->Word()); } }; enum CYIdentifierFlags { CYIdentifierArgument, - CYIdentifierInternal, - CYIdentifierVariable + CYIdentifierVariable, + CYIdentifierOther, + CYIdentifierMagic, }; +typedef std::set CYCStringSet; typedef std::set CYIdentifierValueSet; -typedef std::set CYIdentifierAddressSet; typedef std::map CYIdentifierAddressFlagsMap; +struct CYIdentifierUsage { + CYIdentifier *identifier_; + size_t usage_; +}; + +typedef std::vector CYIdentifierUsageVector; + struct CYScope { CYScope *parent_; - CYIdentifierValueSet identifiers_; + CYIdentifierAddressFlagsMap internal_; - unsigned offset_; + CYIdentifierValueSet identifiers_; CYScope() : - parent_(NULL), - offset_(0) + parent_(NULL) { } - void Add(CYContext &context, CYIdentifierAddressSet &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_; @@ -337,20 +354,46 @@ struct CYProgram : } 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 + 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) { } @@ -410,12 +453,39 @@ class CYDriver { CYProgram *program_; Errors errors_; + bool auto_; + + struct Context { + CYExpression *context_; + + Context(CYExpression *context) : + context_(context) + { + } + + typedef std::vector Words; + Words words_; + }; + + typedef std::vector Contexts; + Contexts contexts_; + + CYExpression *context_; + + enum Mode { + AutoNone, + AutoPrimary, + AutoDirect, + AutoIndirect, + AutoMessage + } mode_; + private: void ScannerInit(); void ScannerDestroy(); public: - CYDriver(const std::string &filename); + CYDriver(apr_pool_t *pool = NULL, const std::string &filename = ""); ~CYDriver(); Condition GetCondition(); @@ -467,6 +537,8 @@ struct CYExpression : virtual const char *ForEachIn() const; virtual CYExpression *ForEachIn(CYContext &out); + virtual CYExpression *AddArgument(CYContext &context, CYExpression *value); + virtual void Output(CYOutput &out) const; virtual void Output(CYOutput &out, CYFlags flags) const = 0; void Output(CYOutput &out, unsigned precedence, CYFlags flags) const; @@ -546,7 +618,22 @@ struct CYFunctionParameter : { } - void Replace(CYContext &context); + virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code); + virtual void Output(CYOutput &out) const; +}; + +struct CYOptionalFunctionParameter : + CYFunctionParameter +{ + CYExpression *initializer_; + + CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) : + CYFunctionParameter(name, next), + initializer_(initializer) + { + } + + virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code); virtual void Output(CYOutput &out) const; }; @@ -1252,6 +1339,8 @@ struct CYNew : virtual CYExpression *Replace(CYContext &context); virtual void Output(CYOutput &out, CYFlags flags) const; + + virtual CYExpression *AddArgument(CYContext &context, CYExpression *value); }; struct CYCall : @@ -1271,6 +1360,29 @@ struct CYCall : virtual CYExpression *Replace(CYContext &context); virtual void Output(CYOutput &out, CYFlags flags) const; + + virtual CYExpression *AddArgument(CYContext &context, CYExpression *value); +}; + +struct CYRubyProc; + +struct CYRubyBlock : + CYExpression +{ + CYExpression *call_; + CYRubyProc *proc_; + + CYRubyBlock(CYExpression *call, CYRubyProc *proc) : + call_(call), + proc_(proc) + { + } + + CYPrecedence(1) + CYRightHand(false) + + virtual CYExpression *Replace(CYContext &context); + virtual void Output(CYOutput &out, CYFlags flags) const; }; struct CYIf : @@ -1323,9 +1435,8 @@ struct CYWhile : virtual void Output(CYOutput &out, CYFlags flags) const; }; -struct CYFunction : - CYScope -{ +// XXX: this should be split up into CYAnonymousFunction and CYNamedFunction (subclass) +struct CYFunction { CYIdentifier *name_; CYFunctionParameter *parameters_; CYBlock code_; @@ -1333,17 +1444,19 @@ struct CYFunction : CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) : name_(name), parameters_(parameters), - code_(statements, this) + code_(statements) { } virtual ~CYFunction() { } - virtual void Replace_(CYContext &context); + void Inject(CYContext &context); + virtual void Replace_(CYContext &context, bool outer); virtual void Output(CYOutput &out, CYFlags flags) const; }; +// XXX: this should be split up into CYAnonymousFunctionExpression and CYNamedFunctionExpression struct CYFunctionExpression : CYFunction, CYExpression @@ -1360,6 +1473,20 @@ struct CYFunctionExpression : virtual void Output(CYOutput &out, CYFlags flags) const; }; +// XXX: this should derive from CYAnonymousFunctionExpression +struct CYRubyProc : + CYFunctionExpression +{ + CYRubyProc(CYFunctionParameter *parameters, CYStatement *statements) : + CYFunctionExpression(NULL, parameters, statements) + { + } + + virtual CYExpression *Replace(CYContext &context); + virtual void Output(CYOutput &out, CYFlags flags) const; +}; + +// XXX: this should derive from CYNamedFunction struct CYFunctionStatement : CYFunction, CYStatement