+/* Cycript - Remove Execution Server and Disassembler
+ * Copyright (C) 2009 Jay Freeman (saurik)
+*/
+
+/* Modified BSD License {{{ */
+/*
+ * Redistribution and use in source and binary
+ * forms, with or without modification, are permitted
+ * provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the
+ * above copyright notice, this list of conditions
+ * and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the
+ * above copyright notice, this list of conditions
+ * and the following disclaimer in the documentation
+ * and/or other materials provided with the
+ * distribution.
+ * 3. The name of the author may not be used to endorse
+ * or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+ * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/* }}} */
+
#ifndef CYPARSER_HPP
#define CYPARSER_HPP
virtual void Output(std::ostream &out, bool block) const;
};
-struct CYName :
- CYThing
-{
- virtual const char *Name() const = 0;
+struct CYPropertyName {
+ virtual void PropertyName(std::ostream &out) const = 0;
+};
+
+struct CYClassName {
+ virtual void ClassName(std::ostream &out) const = 0;
};
struct CYWord :
- CYName
+ CYThing,
+ CYPropertyName,
+ CYClassName
{
const char *word_;
return word_;
}
- virtual const char *Name() const {
- return Value();
- }
-
virtual void Output(std::ostream &out) const;
+
+ virtual void ClassName(std::ostream &out) const;
+ virtual void PropertyName(std::ostream &out) const;
};
struct CYIdentifier :
};
enum CYFlags {
- CYNoFlags,
- CYNoBrace,
- CYNoFunction,
- CYNoLeader,
- CYNoTrailer,
- CYNoIn
+ CYNoFlags = 0,
+ CYNoBrace = (1 << 0),
+ CYNoFunction = (1 << 1),
+ CYNoLeader = (1 << 2),
+ CYNoTrailer = (1 << 3),
+ CYNoIn = (1 << 4),
};
struct CYExpression :
CYNext<CYExpression>,
CYForInitialiser,
- CYForInInitialiser
+ CYForInInitialiser,
+ CYClassName
{
virtual unsigned Precedence() const = 0;
virtual void Part(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 const char *Word() const {
return NULL;
}
CYPrecedence(0)
};
+struct CYMagic :
+ CYExpression
+{
+ CYPrecedence(0)
+};
+
struct CYSelectorPart :
CYNext<CYSelectorPart>
{
}
};
+extern CYRange DigitRange_;
extern CYRange WordStartRange_;
extern CYRange WordEndRange_;
struct CYString :
CYLiteral,
- CYName
+ CYPropertyName
{
const char *value_;
size_t size_;
return value_;
}
- virtual const char *Name() const {
- return Value();
- }
-
virtual const char *Word() const {
if (size_ == 0 || !WordStartRange_[value_[0]])
return NULL;
}
virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void PropertyName(std::ostream &out) const;
};
struct CYNumber :
CYLiteral,
- CYName
+ CYPropertyName
{
double value_;
return value_;
}
- virtual const char *Name() const {
- throw;
- }
-
virtual void Output(std::ostream &out) const {
return Output(out, CYNoFlags);
}
virtual void Output(std::ostream &out, CYFlags flags) const;
+ virtual void PropertyName(std::ostream &out) const;
};
struct CYNull :
struct CYThis :
CYWord,
- CYExpression
+ CYMagic
{
CYThis() :
CYWord("this")
{
}
- CYPrecedence(0)
-
virtual void Output(std::ostream &out, CYFlags flags) const;
};
{
}
+ void SetLeft(CYExpression *lhs) {
+ lhs_ = lhs;
+ }
+
virtual bool Alphabetic() const = 0;
virtual const char *Operator() const = 0;
{
}
+ void SetLeft(CYExpression *lhs) {
+ lhs_ = lhs;
+ }
+
virtual const char *Operator() const = 0;
virtual void Output(std::ostream &out, CYFlags flags) const;
};
struct CYMessage :
- CYSource
+ CYNext<CYMessage>
{
bool instance_;
CYExpression *type_;
{
}
- virtual void Output(std::ostream &out) const;
+ virtual void Output(std::ostream &out, bool replace) const;
};
struct CYClass :
virtual void Output(std::ostream &out) const;
};
+struct CYCategory :
+ CYSource
+{
+ CYClassName *name_;
+ CYMessage *messages_;
+
+ CYCategory(CYClassName *name, CYMessage *messages) :
+ name_(name),
+ messages_(messages)
+ {
+ }
+
+ virtual void Output(std::ostream &out) const;
+};
+
struct CYFunctionParameter :
CYNext<CYFunctionParameter>,
CYThing
struct CYProperty :
CYNext<CYProperty>
{
- CYName *name_;
+ CYPropertyName *name_;
CYExpression *value_;
- CYProperty(CYName *name, CYExpression *value, CYProperty *next) :
+ CYProperty(CYPropertyName *name, CYExpression *value, CYProperty *next) :
CYNext<CYProperty>(next),
name_(name),
value_(value)
{
}
+ 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;