X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/3b52fd1a20c639d7a716d3e0f3176a55f2fcba72..5db9a7f565cc598e8ad179a08d771e1b6ab10928:/Parser.hpp diff --git a/Parser.hpp b/Parser.hpp index e954748..aced8b0 100644 --- a/Parser.hpp +++ b/Parser.hpp @@ -1,4 +1,4 @@ -/* Cycript - Remove Execution Server and Disassembler +/* Cycript - Error.hppution Server and Disassembler * Copyright (C) 2009 Jay Freeman (saurik) */ @@ -40,10 +40,16 @@ #ifndef CYPARSER_HPP #define CYPARSER_HPP -#include +// XXX: wtf is this here?! +#define CYPA 16 + +#include + #include #include +#include + #include "location.hh" #include "Pooling.hpp" @@ -67,6 +73,9 @@ struct CYNext { }; struct CYThing { + virtual ~CYThing() { + } + virtual void Output(struct CYOutput &out) const = 0; }; @@ -111,6 +120,9 @@ struct CYOutput { struct CYPropertyName { virtual void PropertyName(CYOutput &out) const = 0; + + virtual ~CYPropertyName() { + } }; struct CYExpression; @@ -151,6 +163,9 @@ struct CYContext { struct CYStatement : CYNext { + virtual ~CYStatement() { + } + void Single(CYOutput &out, CYFlags flags) const; void Multiple(CYOutput &out, CYFlags flags = CYNoFlags) const; @@ -192,6 +207,9 @@ struct CYStatements { }; struct CYClassName { + virtual ~CYClassName() { + } + virtual CYExpression *ClassName(CYContext &context, bool object) = 0; virtual void ClassName(CYOutput &out, bool object) const = 0; }; @@ -274,6 +292,10 @@ struct CYBlock : { } + operator CYStatement *() const { + return statements_; + } + virtual CYStatement *Replace(CYContext &context); virtual void Output(CYOutput &out) const; @@ -300,8 +322,9 @@ class CYDriver { bool strict_; enum Condition { - RegExStart, - RegExRest + RegExpCondition, + XMLContentCondition, + XMLTagCondition, }; std::string filename_; @@ -325,22 +348,34 @@ class CYDriver { CYDriver(const std::string &filename); ~CYDriver(); + Condition GetCondition(); void SetCondition(Condition condition); + void PushCondition(Condition condition); + void PopCondition(); + void Warning(const cy::location &location, const char *message); }; struct CYForInitialiser { + virtual ~CYForInitialiser() { + } + virtual void For(CYOutput &out) const = 0; }; struct CYForInInitialiser { + virtual ~CYForInInitialiser() { + } + virtual void ForIn(CYOutput &out, CYFlags flags) const = 0; virtual const char *ForEachIn() const = 0; - virtual void ForEachIn(CYOutput &out) const = 0; virtual CYExpression *ForEachIn(CYContext &out) = 0; }; +struct CYNumber; +struct CYString; + struct CYExpression : CYNext, CYForInitialiser, @@ -358,7 +393,6 @@ struct CYExpression : virtual void ForIn(CYOutput &out, CYFlags flags) const; virtual const char *ForEachIn() const; - virtual void ForEachIn(CYOutput &out) const; virtual CYExpression *ForEachIn(CYContext &out); virtual void Output(CYOutput &out) const; @@ -372,6 +406,18 @@ struct CYExpression : virtual CYExpression *Replace(CYContext &context) = 0; + virtual CYExpression *Primitive(CYContext &context) { + return this; + } + + virtual CYNumber *Number(CYContext &context) { + return NULL; + } + + virtual CYString *String(CYContext &context) { + return NULL; + } + virtual const char *Word() const { return NULL; } @@ -435,17 +481,12 @@ struct CYComprehension : CYNext, CYThing { - void Output(CYOutput &out) const; virtual const char *Name() const = 0; - virtual void Begin_(CYOutput &out) const = 0; - - virtual void End_(CYOutput &out) const { - } - virtual CYFunctionParameter *Parameter(CYContext &context) const = 0; CYFunctionParameter *Parameters(CYContext &context) const; virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const; + virtual void Output(CYOutput &out) const = 0; }; struct CYForInComprehension : @@ -464,10 +505,9 @@ struct CYForInComprehension : return name_->Value(); } - virtual void Begin_(CYOutput &out) const; - virtual CYFunctionParameter *Parameter(CYContext &context) const; virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const; + virtual void Output(CYOutput &out) const; }; struct CYForEachInComprehension : @@ -486,11 +526,9 @@ struct CYForEachInComprehension : return name_->Value(); } - virtual void Begin_(CYOutput &out) const; - virtual void End_(CYOutput &out) const; - virtual CYFunctionParameter *Parameter(CYContext &context) const; virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const; + virtual void Output(CYOutput &out) const; }; struct CYIfComprehension : @@ -507,10 +545,9 @@ struct CYIfComprehension : return NULL; } - virtual void Begin_(CYOutput &out) const; - virtual CYFunctionParameter *Parameter(CYContext &context) const; virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const; + virtual void Output(CYOutput &out) const; }; struct CYArrayComprehension : @@ -612,42 +649,12 @@ struct CYString : virtual const char *Word() const; - virtual void Output(CYOutput &out, CYFlags flags) const; - virtual void PropertyName(CYOutput &out) const; -}; - -struct CYSelectorPart : - CYNext, - CYThing -{ - CYWord *name_; - bool value_; - - CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next) : - CYNext(next), - name_(name), - value_(value) - { - } - - CYString *Replace(CYContext &context); - virtual void Output(CYOutput &out) const; -}; - -struct CYSelector : - CYLiteral -{ - CYSelectorPart *name_; - - CYSelector(CYSelectorPart *name) : - name_(name) - { - } - - CYPrecedence(1) + virtual CYNumber *Number(CYContext &context); + virtual CYString *String(CYContext &context); - virtual CYExpression *Replace(CYContext &context); + CYString *Concat(CYContext &out, CYString *rhs) const; virtual void Output(CYOutput &out, CYFlags flags) const; + virtual void PropertyName(CYOutput &out) const; }; struct CYNumber : @@ -665,6 +672,9 @@ struct CYNumber : return value_; } + virtual CYNumber *Number(CYContext &context); + virtual CYString *String(CYContext &context); + virtual void Output(CYOutput &out, CYFlags flags) const; virtual void PropertyName(CYOutput &out) const; }; @@ -695,6 +705,9 @@ struct CYNull : { } + virtual CYNumber *Number(CYContext &context); + virtual CYString *String(CYContext &context); + virtual void Output(CYOutput &out, CYFlags flags) const; }; @@ -730,6 +743,9 @@ struct CYFalse : virtual bool Value() const { return false; } + + virtual CYNumber *Number(CYContext &context); + virtual CYString *String(CYContext &context); }; struct CYTrue : @@ -744,6 +760,9 @@ struct CYTrue : virtual bool Value() const { return true; } + + virtual CYNumber *Number(CYContext &context); + virtual CYString *String(CYContext &context); }; struct CYVariable : @@ -841,6 +860,8 @@ struct CYAssignment : virtual const char *Operator() const = 0; + CYPrecedence(16) + virtual CYExpression *Replace(CYContext &context); virtual void Output(CYOutput &out, CYFlags flags) const; }; @@ -892,7 +913,7 @@ struct CYClause : { } - virtual void Replace(CYContext &context); + void Replace(CYContext &context); virtual void Output(CYOutput &out) const; }; @@ -926,13 +947,31 @@ struct CYArray : virtual void Output(CYOutput &out, CYFlags flags) const; }; +struct CYProperty : + CYNext, + CYThing +{ + CYPropertyName *name_; + CYExpression *value_; + + CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) : + CYNext(next), + name_(name), + value_(value) + { + } + + void Replace(CYContext &context); + virtual void Output(CYOutput &out) const; +}; + struct CYDeclaration : CYForInInitialiser { CYIdentifier *identifier_; CYExpression *initialiser_; - CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser) : + CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) : identifier_(identifier), initialiser_(initialiser) { @@ -941,7 +980,6 @@ struct CYDeclaration : virtual void ForIn(CYOutput &out, CYFlags flags) const; virtual const char *ForEachIn() const; - virtual void ForEachIn(CYOutput &out) const; virtual CYExpression *ForEachIn(CYContext &out); void Replace(CYContext &context); @@ -956,7 +994,7 @@ struct CYDeclarations : { CYDeclaration *declaration_; - CYDeclarations(CYDeclaration *declaration, CYDeclarations *next) : + CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) : CYNext(next), declaration_(declaration) { @@ -965,6 +1003,7 @@ struct CYDeclarations : virtual void For(CYOutput &out) const; void Replace(CYContext &context); + CYProperty *Property(CYContext &context); virtual void Output(CYOutput &out) const; virtual void Output(CYOutput &out, CYFlags flags) const; @@ -1000,114 +1039,6 @@ struct CYLet : virtual void Output(CYOutput &out, CYFlags flags) const; }; -struct CYField : - CYNext -{ - CYStatement *Replace(CYContext &context) const; - void Output(CYOutput &out) const; -}; - -struct CYMessageParameter : - CYNext -{ - CYWord *tag_; - CYExpression *type_; - CYIdentifier *name_; - - CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) : - tag_(tag), - type_(type), - name_(name) - { - } - - CYFunctionParameter *Parameters(CYContext &context) const; - CYSelector *Selector(CYContext &context) const; - CYSelectorPart *SelectorPart(CYContext &context) const; -}; - -struct CYMessage : - CYNext -{ - bool instance_; - CYExpression *type_; - CYMessageParameter *parameters_; - CYStatement *statements_; - - CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYStatement *statements) : - instance_(instance), - type_(type), - parameters_(parameter), - statements_(statements) - { - } - - CYStatement *Replace(CYContext &context, bool replace) const; - void Output(CYOutput &out, bool replace) const; -}; - -struct CYClass { - CYClassName *name_; - CYExpression *super_; - CYField *fields_; - CYMessage *messages_; - - CYClass(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) : - name_(name), - super_(super), - fields_(fields), - messages_(messages) - { - } - - CYExpression *Replace_(CYContext &context); - virtual void Output(CYOutput &out, CYFlags flags) const; -}; - -struct CYClassExpression : - CYClass, - CYExpression -{ - CYClassExpression(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) : - CYClass(name, super, fields, messages) - { - } - - CYPrecedence(0) - - virtual CYExpression *Replace(CYContext &context); - virtual void Output(CYOutput &out, CYFlags flags) const; -}; - -struct CYClassStatement : - CYClass, - CYStatement -{ - CYClassStatement(CYClassName *name, CYExpression *super, CYField *fields, CYMessage *messages) : - CYClass(name, super, fields, messages) - { - } - - virtual CYStatement *Replace(CYContext &context); - virtual void Output(CYOutput &out, CYFlags flags) const; -}; - -struct CYCategory : - CYStatement -{ - CYClassName *name_; - CYMessage *messages_; - - CYCategory(CYClassName *name, CYMessage *messages) : - name_(name), - messages_(messages) - { - } - - virtual CYStatement *Replace(CYContext &context); - virtual void Output(CYOutput &out, CYFlags flags) const; -}; - struct CYFor : CYStatement { @@ -1164,24 +1095,6 @@ struct CYForEachIn : virtual void Output(CYOutput &out, CYFlags flags) const; }; -struct CYProperty : - CYNext, - CYThing -{ - CYPropertyName *name_; - CYExpression *value_; - - CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next = NULL) : - CYNext(next), - name_(name), - value_(value) - { - } - - void Replace(CYContext &context); - virtual void Output(CYOutput &out) const; -}; - struct CYObject : CYLiteral { @@ -1196,40 +1109,6 @@ struct CYObject : void Output(CYOutput &out, CYFlags flags) const; }; -struct CYCatch : - CYThing -{ - CYIdentifier *name_; - CYBlock code_; - - CYCatch(CYIdentifier *name, CYStatement *statements) : - name_(name), - code_(statements) - { - } - - void Replace(CYContext &context); - virtual void Output(CYOutput &out) const; -}; - -struct CYSend : - CYExpression -{ - CYExpression *self_; - CYArgument *arguments_; - - CYSend(CYExpression *self, CYArgument *arguments) : - self_(self), - arguments_(arguments) - { - } - - CYPrecedence(0) - - virtual CYExpression *Replace(CYContext &context); - virtual void Output(CYOutput &out, CYFlags flags) const; -}; - struct CYMember : CYExpression { @@ -1382,6 +1261,9 @@ struct CYFunction { { } + virtual ~CYFunction() { + } + virtual void Replace_(CYContext &context); virtual void Output(CYOutput &out, CYFlags flags) const; }; @@ -1492,14 +1374,33 @@ struct CYFinally : virtual void Output(CYOutput &out) const; }; -struct CYTry : +namespace cy { +namespace Syntax { + +struct Catch : + CYThing +{ + CYIdentifier *name_; + CYBlock code_; + + Catch(CYIdentifier *name, CYStatement *statements) : + name_(name), + code_(statements) + { + } + + void Replace(CYContext &context); + virtual void Output(CYOutput &out) const; +}; + +struct Try : CYStatement { CYBlock code_; - CYCatch *catch_; + Catch *catch_; CYFinally *finally_; - CYTry(CYStatement *statements, CYCatch *_catch, CYFinally *finally) : + Try(CYStatement *statements, Catch *_catch, CYFinally *finally) : code_(statements), catch_(_catch), finally_(finally) @@ -1510,12 +1411,12 @@ struct CYTry : virtual void Output(CYOutput &out, CYFlags flags) const; }; -struct CYThrow : +struct Throw : CYStatement { CYExpression *value_; - CYThrow(CYExpression *value) : + Throw(CYExpression *value) : value_(value) { } @@ -1524,6 +1425,8 @@ struct CYThrow : virtual void Output(CYOutput &out, CYFlags flags) const; }; +} } + struct CYWith : CYStatement { @@ -1610,10 +1513,13 @@ struct CYIndirect : virtual CYExpression *Replace(CYContext &context); }; -#define CYPostfix_(op, name) \ +#define CYReplace \ + virtual CYExpression *Replace(CYContext &context); + +#define CYPostfix_(op, name, args...) \ struct CY ## name : \ CYPostfix \ - { \ + { args \ CY ## name(CYExpression *lhs) : \ CYPostfix(lhs) \ { \ @@ -1624,10 +1530,10 @@ struct CYIndirect : } \ }; -#define CYPrefix_(alphabetic, op, name) \ +#define CYPrefix_(alphabetic, op, name, args...) \ struct CY ## name : \ CYPrefix \ - { \ + { args \ CY ## name(CYExpression *rhs) : \ CYPrefix(rhs) \ { \ @@ -1640,10 +1546,10 @@ struct CYIndirect : } \ }; -#define CYInfix_(alphabetic, precedence, op, name) \ +#define CYInfix_(alphabetic, precedence, op, name, args...) \ struct CY ## name : \ CYInfix \ - { \ + { args \ CY ## name(CYExpression *lhs, CYExpression *rhs) : \ CYInfix(lhs, rhs) \ { \ @@ -1657,16 +1563,14 @@ struct CYIndirect : } \ }; -#define CYAssignment_(op, name) \ +#define CYAssignment_(op, name, args...) \ struct CY ## name ## Assign : \ CYAssignment \ - { \ + { args \ CY ## name ## Assign(CYExpression *lhs, CYExpression *rhs) : \ CYAssignment(lhs, rhs) \ { \ } \ - \ - CYPrecedence(16) \ \ virtual const char *Operator() const { \ return op; \ @@ -1689,7 +1593,7 @@ CYPrefix_(false, "!", LogicalNot) CYInfix_(false, 5, "*", Multiply) CYInfix_(false, 5, "/", Divide) CYInfix_(false, 5, "%", Modulus) -CYInfix_(false, 6, "+", Add) +CYInfix_(false, 6, "+", Add, CYReplace) CYInfix_(false, 6, "-", Subtract) CYInfix_(false, 7, "<<", ShiftLeft) CYInfix_(false, 7, ">>", ShiftRightSigned)