]> git.saurik.com Git - cycript.git/blobdiff - Syntax.hpp
Fix Objective-C dictionary/array literal lowering.
[cycript.git] / Syntax.hpp
index 7bc5bbe18b75ded521881ff430530c4cb90b368b..9786ee7be23ed1ed21bd3f9ba7a1928db4a1e51f 100644 (file)
 #include "Location.hpp"
 #include "Options.hpp"
 #include "Pooling.hpp"
 #include "Location.hpp"
 #include "Options.hpp"
 #include "Pooling.hpp"
+#include "String.hpp"
+
+double CYCastDouble(const char *value, size_t size);
+double CYCastDouble(const char *value);
+double CYCastDouble(CYUTF8String value);
+
+void CYNumerify(std::ostringstream &str, double value);
+void CYStringify(std::ostringstream &str, const char *data, size_t size, bool c = false);
+
+// XXX: this really should not be here ... :/
+void *CYPoolFile(CYPool &pool, const char *path, size_t *psize);
+CYUTF8String CYPoolFileUTF8String(CYPool &pool, const char *path);
 
 struct CYContext;
 
 
 struct CYContext;
 
@@ -577,17 +589,17 @@ struct CYParenthetical :
     void Output(CYOutput &out, CYFlags flags) const;
 };
 
     void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYDeclaration;
+struct CYBinding;
 
 struct CYFunctionParameter :
     CYNext<CYFunctionParameter>,
     CYThing
 {
 
 struct CYFunctionParameter :
     CYNext<CYFunctionParameter>,
     CYThing
 {
-    CYDeclaration *initialiser_;
+    CYBinding *binding_;
 
 
-    CYFunctionParameter(CYDeclaration *initialiser, CYFunctionParameter *next = NULL) :
+    CYFunctionParameter(CYBinding *binding, CYFunctionParameter *next = NULL) :
         CYNext<CYFunctionParameter>(next),
         CYNext<CYFunctionParameter>(next),
-        initialiser_(initialiser)
+        binding_(binding)
     {
     }
 
     {
     }
 
@@ -604,11 +616,6 @@ struct CYComprehension :
     {
     }
 
     {
     }
 
-    CYComprehension *Modify(CYComprehension *next) {
-        next_ = next;
-        return this;
-    }
-
     virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
     CYFunctionParameter *Parameters(CYContext &context) const;
     virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
     virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
     CYFunctionParameter *Parameters(CYContext &context) const;
     virtual CYStatement *Replace(CYContext &context, CYStatement *statement) const;
@@ -618,13 +625,13 @@ struct CYComprehension :
 struct CYForInComprehension :
     CYComprehension
 {
 struct CYForInComprehension :
     CYComprehension
 {
-    CYDeclaration *declaration_;
-    CYExpression *set_;
+    CYBinding *binding_;
+    CYExpression *iterable_;
 
 
-    CYForInComprehension(CYDeclaration *declaration, CYExpression *set, CYComprehension *next = NULL) :
+    CYForInComprehension(CYBinding *binding, CYExpression *iterable, CYComprehension *next = NULL) :
         CYComprehension(next),
         CYComprehension(next),
-        declaration_(declaration),
-        set_(set)
+        binding_(binding),
+        iterable_(iterable)
     {
     }
 
     {
     }
 
@@ -636,13 +643,13 @@ struct CYForInComprehension :
 struct CYForOfComprehension :
     CYComprehension
 {
 struct CYForOfComprehension :
     CYComprehension
 {
-    CYDeclaration *declaration_;
-    CYExpression *set_;
+    CYBinding *binding_;
+    CYExpression *iterable_;
 
 
-    CYForOfComprehension(CYDeclaration *declaration, CYExpression *set, CYComprehension *next = NULL) :
+    CYForOfComprehension(CYBinding *binding, CYExpression *iterable, CYComprehension *next = NULL) :
         CYComprehension(next),
         CYComprehension(next),
-        declaration_(declaration),
-        set_(set)
+        binding_(binding),
+        iterable_(iterable)
     {
     }
 
     {
     }
 
@@ -896,6 +903,12 @@ struct CYThis :
 struct CYBoolean :
     CYTrivial
 {
 struct CYBoolean :
     CYTrivial
 {
+    CYPrecedence(4)
+
+    virtual bool RightHand() const {
+        return true;
+    }
+
     virtual bool Value() const = 0;
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
     virtual bool Value() const = 0;
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
@@ -1062,11 +1075,11 @@ struct CYClause :
     CYThing,
     CYNext<CYClause>
 {
     CYThing,
     CYNext<CYClause>
 {
-    CYExpression *case_;
+    CYExpression *value_;
     CYStatement *code_;
 
     CYStatement *code_;
 
-    CYClause(CYExpression *_case, CYStatement *code) :
-        case_(_case),
+    CYClause(CYExpression *value, CYStatement *code) :
+        value_(value),
         code_(code)
     {
     }
         code_(code)
     {
     }
@@ -1076,21 +1089,26 @@ struct CYClause :
 };
 
 struct CYElement :
 };
 
 struct CYElement :
+    CYNext<CYElement>,
     CYThing
 {
     CYThing
 {
+    CYElement(CYElement *next) :
+        CYNext<CYElement>(next)
+    {
+    }
+
     virtual bool Elision() const = 0;
 
     virtual void Replace(CYContext &context) = 0;
 };
 
 struct CYElementValue :
     virtual bool Elision() const = 0;
 
     virtual void Replace(CYContext &context) = 0;
 };
 
 struct CYElementValue :
-    CYNext<CYElement>,
     CYElement
 {
     CYExpression *value_;
 
     CYElement
 {
     CYExpression *value_;
 
-    CYElementValue(CYExpression *value, CYElement *next) :
-        CYNext<CYElement>(next),
+    CYElementValue(CYExpression *value, CYElement *next = NULL) :
+        CYElement(next),
         value_(value)
     {
     }
         value_(value)
     {
     }
@@ -1108,7 +1126,8 @@ struct CYElementSpread :
 {
     CYExpression *value_;
 
 {
     CYExpression *value_;
 
-    CYElementSpread(CYExpression *value) :
+    CYElementSpread(CYExpression *value, CYElement *next = NULL) :
+        CYElement(next),
         value_(value)
     {
     }
         value_(value)
     {
     }
@@ -1135,13 +1154,13 @@ struct CYArray :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYDeclaration {
+struct CYBinding {
     CYIdentifier *identifier_;
     CYIdentifier *identifier_;
-    CYExpression *initialiser_;
+    CYExpression *initializer_;
 
 
-    CYDeclaration(CYIdentifier *identifier, CYExpression *initialiser = NULL) :
+    CYBinding(CYIdentifier *identifier, CYExpression *initializer = NULL) :
         identifier_(identifier),
         identifier_(identifier),
-        initialiser_(initialiser)
+        initializer_(initializer)
     {
     }
 
     {
     }
 
@@ -1155,11 +1174,11 @@ struct CYForLexical :
     CYForInInitializer
 {
     bool constant_;
     CYForInInitializer
 {
     bool constant_;
-    CYDeclaration *declaration_;
+    CYBinding *binding_;
 
 
-    CYForLexical(bool constant, CYDeclaration *declaration) :
+    CYForLexical(bool constant, CYBinding *binding) :
         constant_(constant),
         constant_(constant),
-        declaration_(declaration)
+        binding_(binding)
     {
     }
 
     {
     }
 
@@ -1172,10 +1191,10 @@ struct CYForLexical :
 struct CYForVariable :
     CYForInInitializer
 {
 struct CYForVariable :
     CYForInInitializer
 {
-    CYDeclaration *declaration_;
+    CYBinding *binding_;
 
 
-    CYForVariable(CYDeclaration *declaration) :
-        declaration_(declaration)
+    CYForVariable(CYBinding *binding) :
+        binding_(binding)
     {
     }
 
     {
     }
 
@@ -1185,15 +1204,15 @@ struct CYForVariable :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYDeclarations :
-    CYNext<CYDeclarations>,
+struct CYBindings :
+    CYNext<CYBindings>,
     CYThing
 {
     CYThing
 {
-    CYDeclaration *declaration_;
+    CYBinding *binding_;
 
 
-    CYDeclarations(CYDeclaration *declaration, CYDeclarations *next = NULL) :
-        CYNext<CYDeclarations>(next),
-        declaration_(declaration)
+    CYBindings(CYBinding *binding, CYBindings *next = NULL) :
+        CYNext<CYBindings>(next),
+        binding_(binding)
     {
     }
 
     {
     }
 
@@ -1209,10 +1228,10 @@ struct CYDeclarations :
 struct CYVar :
     CYForInitializer
 {
 struct CYVar :
     CYForInitializer
 {
-    CYDeclarations *declarations_;
+    CYBindings *bindings_;
 
 
-    CYVar(CYDeclarations *declarations) :
-        declarations_(declarations)
+    CYVar(CYBindings *bindings) :
+        bindings_(bindings)
     {
     }
 
     {
     }
 
@@ -1222,15 +1241,15 @@ struct CYVar :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYLet :
+struct CYLexical :
     CYForInitializer
 {
     bool constant_;
     CYForInitializer
 {
     bool constant_;
-    CYDeclarations *declarations_;
+    CYBindings *bindings_;
 
 
-    CYLet(bool constant, CYDeclarations *declarations) :
+    CYLexical(bool constant, CYBindings *bindings) :
         constant_(constant),
         constant_(constant),
-        declarations_(declarations)
+        bindings_(bindings)
     {
     }
 
     {
     }
 
@@ -1241,7 +1260,7 @@ struct CYLet :
 };
 
 struct CYBuilder {
 };
 
 struct CYBuilder {
-    CYList<CYDeclarations> declarations_;
+    CYList<CYBindings> bindings_;
     CYList<CYStatement> statements_;
 
     operator bool() const {
     CYList<CYStatement> statements_;
 
     operator bool() const {
@@ -1291,13 +1310,13 @@ struct CYPropertyValue :
 struct CYFor :
     CYStatement
 {
 struct CYFor :
     CYStatement
 {
-    CYForInitializer *initialiser_;
+    CYForInitializer *initializer_;
     CYExpression *test_;
     CYExpression *increment_;
     CYStatement *code_;
 
     CYExpression *test_;
     CYExpression *increment_;
     CYStatement *code_;
 
-    CYFor(CYForInitializer *initialiser, CYExpression *test, CYExpression *increment, CYStatement *code) :
-        initialiser_(initialiser),
+    CYFor(CYForInitializer *initializer, CYExpression *test, CYExpression *increment, CYStatement *code) :
+        initializer_(initializer),
         test_(test),
         increment_(increment),
         code_(code)
         test_(test),
         increment_(increment),
         code_(code)
@@ -1313,13 +1332,13 @@ struct CYFor :
 struct CYForIn :
     CYStatement
 {
 struct CYForIn :
     CYStatement
 {
-    CYForInInitializer *initialiser_;
-    CYExpression *set_;
+    CYForInInitializer *initializer_;
+    CYExpression *iterable_;
     CYStatement *code_;
 
     CYStatement *code_;
 
-    CYForIn(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
-        initialiser_(initialiser),
-        set_(set),
+    CYForIn(CYForInInitializer *initializer, CYExpression *iterable, CYStatement *code) :
+        initializer_(initializer),
+        iterable_(iterable),
         code_(code)
     {
     }
         code_(code)
     {
     }
@@ -1333,13 +1352,13 @@ struct CYForIn :
 struct CYForInitialized :
     CYStatement
 {
 struct CYForInitialized :
     CYStatement
 {
-    CYDeclaration *declaration_;
-    CYExpression *set_;
+    CYBinding *binding_;
+    CYExpression *iterable_;
     CYStatement *code_;
 
     CYStatement *code_;
 
-    CYForInitialized(CYDeclaration *declaration, CYExpression *set, CYStatement *code) :
-        declaration_(declaration),
-        set_(set),
+    CYForInitialized(CYBinding *binding, CYExpression *iterable, CYStatement *code) :
+        binding_(binding),
+        iterable_(iterable),
         code_(code)
     {
     }
         code_(code)
     {
     }
@@ -1353,13 +1372,13 @@ struct CYForInitialized :
 struct CYForOf :
     CYStatement
 {
 struct CYForOf :
     CYStatement
 {
-    CYForInInitializer *initialiser_;
-    CYExpression *set_;
+    CYForInInitializer *initializer_;
+    CYExpression *iterable_;
     CYStatement *code_;
 
     CYStatement *code_;
 
-    CYForOf(CYForInInitializer *initialiser, CYExpression *set, CYStatement *code) :
-        initialiser_(initialiser),
-        set_(set),
+    CYForOf(CYForInInitializer *initializer, CYExpression *iterable, CYStatement *code) :
+        initializer_(initializer),
+        iterable_(iterable),
         code_(code)
     {
     }
         code_(code)
     {
     }
@@ -1950,70 +1969,87 @@ struct CYTypeError :
     virtual void Output(CYOutput &out) const;
 };
 
     virtual void Output(CYOutput &out) const;
 };
 
-struct CYTypeVoid :
+enum CYTypeSigning {
+    CYTypeNeutral,
+    CYTypeSigned,
+    CYTypeUnsigned,
+};
+
+struct CYTypeCharacter :
     CYTypeSpecifier
 {
     CYTypeSpecifier
 {
-    CYTypeVoid() {
+    CYTypeSigning signing_;
+
+    CYTypeCharacter(CYTypeSigning signing) :
+        signing_(signing)
+    {
     }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
 
     }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
 
-struct CYTypeVariable :
+struct CYTypeIntegral :
     CYTypeSpecifier
 {
     CYTypeSpecifier
 {
-    CYIdentifier *name_;
+    CYTypeSigning signing_;
+    int length_;
 
 
-    CYTypeVariable(CYIdentifier *name) :
-        name_(name)
+    CYTypeIntegral(CYTypeSigning signing, int length = 1) :
+        signing_(signing),
+        length_(length)
     {
     }
 
     {
     }
 
-    CYTypeVariable(const char *name) :
-        name_(new($pool) CYIdentifier(name))
-    {
+    CYTypeIntegral *Long() {
+        if (length_ != 1 && length_ != 2)
+            return NULL;
+        ++length_;
+        return this;
     }
 
     }
 
-    virtual CYTarget *Replace(CYContext &context);
-    virtual void Output(CYOutput &out) const;
-};
+    CYTypeIntegral *Short() {
+        if (length_ != 1)
+            return NULL;
+        --length_;
+        return this;
+    }
 
 
-struct CYTypeUnsigned :
-    CYTypeSpecifier
-{
-    CYTypeSpecifier *specifier_;
+    CYTypeIntegral *Signed() {
+        if (signing_ != CYTypeNeutral)
+            return NULL;
+        signing_ = CYTypeSigned;
+        return this;
+    }
 
 
-    CYTypeUnsigned(CYTypeSpecifier *specifier) :
-        specifier_(specifier)
-    {
+    CYTypeIntegral *Unsigned() {
+        if (signing_ != CYTypeNeutral)
+            return NULL;
+        signing_ = CYTypeUnsigned;
+        return this;
     }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
 
     }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
 
-struct CYTypeSigned :
+struct CYTypeVoid :
     CYTypeSpecifier
 {
     CYTypeSpecifier
 {
-    CYTypeSpecifier *specifier_;
-
-    CYTypeSigned(CYTypeSpecifier *specifier) :
-        specifier_(specifier)
-    {
+    CYTypeVoid() {
     }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
 
     }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 };
 
-struct CYTypeLong :
+struct CYTypeReference :
     CYTypeSpecifier
 {
     CYTypeSpecifier
 {
-    CYTypeSpecifier *specifier_;
+    CYIdentifier *name_;
 
 
-    CYTypeLong(CYTypeSpecifier *specifier) :
-        specifier_(specifier)
+    CYTypeReference(CYIdentifier *name) :
+        name_(name)
     {
     }
 
     {
     }
 
@@ -2021,13 +2057,18 @@ struct CYTypeLong :
     virtual void Output(CYOutput &out) const;
 };
 
     virtual void Output(CYOutput &out) const;
 };
 
-struct CYTypeShort :
+struct CYTypeVariable :
     CYTypeSpecifier
 {
     CYTypeSpecifier
 {
-    CYTypeSpecifier *specifier_;
+    CYIdentifier *name_;
 
 
-    CYTypeShort(CYTypeSpecifier *specifier) :
-        specifier_(specifier)
+    CYTypeVariable(CYIdentifier *name) :
+        name_(name)
+    {
+    }
+
+    CYTypeVariable(const char *name) :
+        name_(new($pool) CYIdentifier(name))
     {
     }
 
     {
     }
 
@@ -2237,6 +2278,39 @@ struct CYImport :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYImportSpecifier :
+    CYNext<CYImportSpecifier>
+{
+    CYWord *name_;
+    CYIdentifier *binding_;
+
+    CYImportSpecifier(CYWord *name, CYIdentifier *binding) :
+        name_(name),
+        binding_(binding)
+    {
+    }
+
+    CYStatement *Replace(CYContext &context, CYIdentifier *module);
+};
+
+struct CYImportDeclaration :
+    CYStatement
+{
+    CYImportSpecifier *specifiers_;
+    CYString *module_;
+
+    CYImportDeclaration(CYImportSpecifier *specifiers, CYString *module) :
+        specifiers_(specifiers),
+        module_(module)
+    {
+    }
+
+    CYCompact(None)
+
+    virtual CYStatement *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYExternal :
     CYStatement
 {
 struct CYExternal :
     CYStatement
 {
@@ -2255,6 +2329,22 @@ struct CYExternal :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYTypeExpression :
+    CYTarget
+{
+    CYTypedIdentifier *typed_;
+
+    CYTypeExpression(CYTypedIdentifier *typed) :
+        typed_(typed)
+    {
+    }
+
+    CYPrecedence(0)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYTypeDefinition :
     CYStatement
 {
 struct CYTypeDefinition :
     CYStatement
 {
@@ -2307,6 +2397,66 @@ struct CYTypeFunctionWith :
     virtual CYTypeFunctionWith *Function() { return this; }
 };
 
     virtual CYTypeFunctionWith *Function() { return this; }
 };
 
+struct CYTypeStructField :
+    CYNext<CYTypeStructField>
+{
+    CYTypedIdentifier *typed_;
+
+    CYTypeStructField(CYTypedIdentifier *typed, CYTypeStructField *next = NULL) :
+        CYNext<CYTypeStructField>(next),
+        typed_(typed)
+    {
+    }
+};
+
+struct CYStructTail :
+    CYThing
+{
+    CYTypeStructField *fields_;
+
+    CYStructTail(CYTypeStructField *fields) :
+        fields_(fields)
+    {
+    }
+
+    CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out) const;
+};
+
+struct CYTypeStruct :
+    CYTypeSpecifier
+{
+    CYIdentifier *name_;
+    CYStructTail *tail_;
+
+    CYTypeStruct(CYIdentifier *name, CYStructTail *tail) :
+        name_(name),
+        tail_(tail)
+    {
+    }
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out) const;
+};
+
+struct CYStructDefinition :
+    CYStatement
+{
+    CYIdentifier *name_;
+    CYStructTail *tail_;
+
+    CYStructDefinition(CYIdentifier *name, CYStructTail *tail) :
+        name_(name),
+        tail_(tail)
+    {
+    }
+
+    CYCompact(None)
+
+    virtual CYStatement *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 namespace cy {
 namespace Syntax {
 
 namespace cy {
 namespace Syntax {