X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/0ff9f149ab24e54a3d4d4919e054a3e8abe28fc7..6f926cee9d6b259845cd91069cb7c6f488d1eed6:/Parser.hpp diff --git a/Parser.hpp b/Parser.hpp index d7cc5fd..66bd872 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -78,9 +78,14 @@ _finline std::ostream &operator <<(std::ostream &out, const CYThing &rhs) { struct CYSource : CYNext { + virtual bool IsBlock() const { + return next_ != NULL; + } + virtual void Show(std::ostream &out) const; virtual void Output(std::ostream &out) const = 0; virtual void Output(std::ostream &out, bool block) const; + virtual void Output_(std::ostream &out) const; }; struct CYPropertyName { @@ -88,7 +93,7 @@ struct CYPropertyName { }; struct CYClassName { - virtual void ClassName(std::ostream &out) const = 0; + virtual void ClassName(std::ostream &out, bool object) const = 0; }; struct CYWord : @@ -109,7 +114,7 @@ struct CYWord : virtual void Output(std::ostream &out) const; - virtual void ClassName(std::ostream &out) const; + virtual void ClassName(std::ostream &out, bool object) const; virtual void PropertyName(std::ostream &out) const; }; @@ -125,11 +130,11 @@ struct CYIdentifier : struct CYLabel : CYNext { - CYIdentifier *identifier_; + CYIdentifier *name_; - CYLabel(CYIdentifier *identifier, CYLabel *next) : + CYLabel(CYIdentifier *name, CYLabel *next) : CYNext(next), - identifier_(identifier) + name_(name) { } }; @@ -137,11 +142,35 @@ struct CYLabel : struct CYStatement : CYSource { - CYLabel *label_; + CYLabel *labels_; + + CYStatement() : + labels_(NULL) + { + } void AddLabel(CYIdentifier *identifier) { - label_ = new CYLabel(identifier, label_); + labels_ = new CYLabel(identifier, labels_); + } + + virtual void Output_(std::ostream &out) const; +}; + +struct CYBlock : + CYStatement +{ + CYStatement *statements_; + + CYBlock(CYStatement *statements) : + statements_(statements) + { + } + + virtual bool IsBlock() const { + return true; } + + virtual void Output(std::ostream &out) const; }; enum CYState { @@ -159,6 +188,7 @@ class CYDriver { const char *data_; size_t size_; + FILE *file_; std::string filename_; @@ -181,20 +211,6 @@ class CYDriver { ~CYDriver(); }; -struct CYPart { - virtual void Part(std::ostream &out) const = 0; -}; - -struct CYForInitialiser : - CYPart -{ -}; - -struct CYForInInitialiser : - CYPart -{ -}; - enum CYFlags { CYNoFlags = 0, CYNoBrace = (1 << 0), @@ -202,6 +218,18 @@ enum CYFlags { CYNoLeader = (1 << 2), CYNoTrailer = (1 << 3), CYNoIn = (1 << 4), + CYNoHyphen = (1 << 5), + CYNoBF = (CYNoBrace | CYNoFunction), +}; + +struct CYForInitialiser { + virtual void For(std::ostream &out) const = 0; +}; + +struct CYForInInitialiser { + virtual void ForIn(std::ostream &out, CYFlags flags) const = 0; + virtual const char *ForEachIn() const = 0; + virtual void ForEachIn(std::ostream &out) const = 0; }; struct CYExpression : @@ -211,11 +239,17 @@ struct CYExpression : CYClassName { virtual unsigned Precedence() const = 0; - virtual void Part(std::ostream &out) const; + + virtual void For(std::ostream &out) const; + virtual void ForIn(std::ostream &out, CYFlags flags) const; + + virtual const char *ForEachIn() const; + virtual void ForEachIn(std::ostream &out) const; + virtual void Output(std::ostream &out, CYFlags flags) const = 0; void Output(std::ostream &out, unsigned precedence, CYFlags flags) const; - virtual void ClassName(std::ostream &out) const; + virtual void ClassName(std::ostream &out, bool object) const; virtual const char *Word() const { return NULL; @@ -255,6 +289,91 @@ struct CYCompound : void Output(std::ostream &out, CYFlags flags) const; }; +struct CYComprehension : + CYNext +{ + void Output(std::ostream &out) const; + virtual const char *Name() const = 0; + + virtual void Begin_(std::ostream &out) const = 0; + + virtual void End_(std::ostream &out) const { + } +}; + +struct CYForInComprehension : + CYComprehension +{ + CYIdentifier *name_; + CYExpression *set_; + + CYForInComprehension(CYIdentifier *name, CYExpression *set) : + name_(name), + set_(set) + { + } + + virtual const char *Name() const { + return name_->Value(); + } + + virtual void Begin_(std::ostream &out) const; +}; + +struct CYForEachInComprehension : + CYComprehension +{ + CYIdentifier *name_; + CYExpression *set_; + + CYForEachInComprehension(CYIdentifier *name, CYExpression *set) : + name_(name), + set_(set) + { + } + + virtual const char *Name() const { + return name_->Value(); + } + + virtual void Begin_(std::ostream &out) const; + virtual void End_(std::ostream &out) const; +}; + +struct CYIfComprehension : + CYComprehension +{ + CYExpression *test_; + + CYIfComprehension(CYExpression *test) : + test_(test) + { + } + + virtual const char *Name() const { + return NULL; + } + + virtual void Begin_(std::ostream &out) const; +}; + +struct CYArrayComprehension : + CYExpression +{ + CYExpression *expression_; + CYComprehension *comprehensions_; + + CYArrayComprehension(CYExpression *expression, CYComprehension *comprehensions) : + expression_(expression), + comprehensions_(comprehensions) + { + } + + CYPrecedence(0) + + virtual void Output(std::ostream &out, CYFlags flags) const; +}; + struct CYLiteral : CYExpression { @@ -598,7 +717,6 @@ struct CYArray : }; struct CYDeclaration : - CYThing, CYForInInitialiser { CYIdentifier *identifier_; @@ -610,24 +728,55 @@ struct CYDeclaration : { } - virtual void Part(std::ostream &out) const; - virtual void Output(std::ostream &out) const; + virtual void ForIn(std::ostream &out, CYFlags flags) const; + + virtual const char *ForEachIn() const; + virtual void ForEachIn(std::ostream &out) const; + + virtual void Output(std::ostream &out, CYFlags flags) const; }; struct CYDeclarations : - CYStatement, + CYNext, CYForInitialiser { CYDeclaration *declaration_; - CYDeclarations *next_; CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) : - declaration_(declaration), - next_(next) + CYNext(next), + declaration_(declaration) + { + } + + virtual void For(std::ostream &out) const; + virtual void Output(std::ostream &out, CYFlags flags) const; +}; + +struct CYVar : + CYStatement +{ + CYDeclarations *declarations_; + + CYVar(CYDeclarations *declarations) : + declarations_(declarations) + { + } + + virtual void Output(std::ostream &out) const; +}; + +struct CYLet : + CYStatement +{ + CYDeclarations *declarations_; + CYStatement *statements_; + + CYLet(CYDeclarations *declarations, CYStatement *statements) : + declarations_(declarations), + statements_(statements) { } - virtual void Part(std::ostream &out) const; virtual void Output(std::ostream &out) const; }; @@ -672,14 +821,15 @@ struct CYMessage : }; struct CYClass : - CYSource + CYExpression, + CYStatement { - CYIdentifier *name_; + CYClassName *name_; CYExpression *super_; CYField *fields_; CYMessage *messages_; - CYClass(CYIdentifier *name, CYExpression *super, CYField *fields, CYMessage *messages) : + CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) : name_(name), super_(super), fields_(fields), @@ -687,11 +837,14 @@ struct CYClass : { } + CYPrecedence(0) + virtual void Output(std::ostream &out) const; + virtual void Output(std::ostream &out, CYFlags flags) const; }; struct CYCategory : - CYSource + CYStatement { CYClassName *name_; CYMessage *messages_; @@ -756,6 +909,23 @@ struct CYForIn : virtual void Output(std::ostream &out) const; }; +struct CYForEachIn : + CYStatement +{ + CYForInInitialiser *initialiser_; + CYExpression *set_; + CYStatement *code_; + + CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) : + initialiser_(initialiser), + set_(set), + code_(code) + { + } + + virtual void Output(std::ostream &out) const; +}; + struct CYProperty : CYNext { @@ -829,6 +999,32 @@ struct CYMember : { } + void SetLeft(CYExpression *object) { + object_ = object; + } +}; + +struct CYDirectMember : + CYMember +{ + CYDirectMember(CYExpression *object, CYExpression *property) : + CYMember(object, property) + { + } + + CYPrecedence(1) + + virtual void Output(std::ostream &out, CYFlags flags) const; +}; + +struct CYIndirectMember : + CYMember +{ + CYIndirectMember(CYExpression *object, CYExpression *property) : + CYMember(object, property) + { + } + CYPrecedence(1) virtual void Output(std::ostream &out, CYFlags flags) const;