]> git.saurik.com Git - cycript.git/commitdiff
Add support for C++11 lambda expression syntax.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 5 Jan 2014 12:24:57 +0000 (04:24 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 6 Jan 2014 13:59:27 +0000 (05:59 -0800)
Cycript.yy.in
ObjectiveC/Replace.cpp
ObjectiveC/Syntax.hpp
Output.cpp
Parser.hpp
Replace.cpp

index 53673a2a0e3f0bfd1251ba0ef1d65d4cf4addeaf..8fd76aacf258f3f8cdf7c06b9e975ecef630218d 100644 (file)
@@ -1577,20 +1577,6 @@ PrimaryExpression
     ;
 /* }}} */
 /* Cycript (Objective-C): Block Expressions {{{ */
-TypedParameterList_
-    : "," TypedParameterList { $$ = $2; }
-    | { $$ = NULL; }
-    ;
-
-TypedParameterList
-    : TypedIdentifier TypedParameterList_ { $$ = CYNew CYTypedParameter($1, $2); }
-    ;
-
-TypedParameterListOpt
-    : TypedParameterList { $$ = $1; }
-    | { $$ = NULL; }
-    ;
-
 PrimaryExpression
     : "^" ModifiedType "(" LexPushInOff TypedParameterListOpt ")" LexPopIn BRACE LexPushInOff FunctionBody "}" LexPopIn { $$ = CYNew CYObjCBlock($2, $5, $10); }
     ;
@@ -1618,6 +1604,25 @@ Var_
     : "auto"
     ;
 /* }}} */
+/* Cycript (C): Lambda Expressions {{{ */
+TypedParameterList_
+    : "," TypedParameterList { $$ = $2; }
+    | { $$ = NULL; }
+    ;
+
+TypedParameterList
+    : TypedIdentifier TypedParameterList_ { $$ = CYNew CYTypedParameter($1, $2); }
+    ;
+
+TypedParameterListOpt
+    : TypedParameterList { $$ = $1; }
+    | { $$ = NULL; }
+    ;
+
+PrimaryExpression
+    : "[" LexPushInOff LexSetRegExp "=" "]" LexPopIn "(" LexPushInOff TypedParameterListOpt ")" LexPopIn "->" ModifiedType BRACE LexPushInOff FunctionBody "}" LexPopIn { $$ = CYNew CYLambda($13, $9, $16); }
+    ;
+/* }}} */
 @end
 
 /* YUI: Documentation Comments {{{ */
index 9197a268ae76cdf28181b43ae5ffe76ae993f8d8..7c47eea4d76a1e3cdf114074cdaae7c9027cfc2b 100644 (file)
@@ -78,22 +78,6 @@ CYStatement *CYClassStatement::Replace(CYContext &context) {
     return $E(Replace_(context));
 }
 
-CYExpression *CYTypeArrayOf::Replace(CYContext &context) {
-    return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("arrayOf")), $ CYArgument(size_));
-}
-
-CYExpression *CYTypeConstant::Replace(CYContext &context) {
-    return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("constant")));
-}
-
-CYExpression *CYTypePointerTo::Replace(CYContext &context) {
-    return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("pointerTo")));
-}
-
-CYExpression *CYTypeVariable::Replace(CYContext &context) {
-    return expression_;
-}
-
 CYExpression *CYEncodedType::Replace(CYContext &context) {
     return type_->Replace(context);
 }
@@ -222,11 +206,3 @@ CYExpression *CYSendDirect::Replace(CYContext &context) {
 CYExpression *CYSendSuper::Replace(CYContext &context) {
     return $ CYSendDirect($V("$cyr"), arguments_);
 }
-
-CYFunctionParameter *CYTypedParameter::Parameters(CYContext &context) { $T(NULL)
-    return $ CYFunctionParameter($ CYDeclaration(typed_->identifier_ ?: context.Unique()), next_->Parameters(context));
-}
-
-CYExpression *CYTypedParameter::TypeSignature(CYContext &context, CYExpression *prefix) { $T(prefix)
-    return next_->TypeSignature(context, $ CYAdd(prefix, typed_->type_->Replace(context)));
-}
index 92e4363badda0d7228f339951a521296429811ce..343cb37e903886be871bfdfcf90f39283b5b4ff2 100644 (file)
 
 #include "Parser.hpp"
 
-struct CYTypeModifier :
-    CYNext<CYTypeModifier>
-{
-    CYTypeModifier(CYTypeModifier *next) :
-        CYNext<CYTypeModifier>(next)
-    {
-    }
-
-    virtual CYExpression *Replace(CYContext &context) = 0;
-};
-
-struct CYTypeArrayOf :
-    CYTypeModifier
-{
-    CYExpression *size_;
-
-    CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
-        CYTypeModifier(next),
-        size_(size)
-    {
-    }
-
-    CYPrecedence(2)
-
-    virtual CYExpression *Replace(CYContext &context);
-};
-
-struct CYTypeConstant :
-    CYTypeModifier
-{
-    CYTypeConstant(CYTypeModifier *next = NULL) :
-        CYTypeModifier(next)
-    {
-    }
-
-    CYPrecedence(3)
-
-    virtual CYExpression *Replace(CYContext &context);
-};
-
-struct CYTypePointerTo :
-    CYTypeModifier
-{
-    CYTypePointerTo(CYTypeModifier *next = NULL) :
-        CYTypeModifier(next)
-    {
-    }
-
-    CYPrecedence(3)
-
-    virtual CYExpression *Replace(CYContext &context);
-};
-
-struct CYTypeVariable :
-    CYTypeModifier
-{
-    CYExpression *expression_;
-
-    CYTypeVariable(CYExpression *expression) :
-        CYTypeModifier(NULL),
-        expression_(expression)
-    {
-    }
-
-    CYPrecedence(1)
-
-    virtual CYExpression *Replace(CYContext &context);
-};
-
-struct CYTypedIdentifier :
-    CYNext<CYTypedIdentifier>
-{
-    CYIdentifier *identifier_;
-    CYTypeModifier *type_;
-
-    CYTypedIdentifier(CYIdentifier *identifier) :
-        identifier_(identifier),
-        type_(NULL)
-    {
-    }
-};
-
-struct CYTypedParameter :
-    CYNext<CYTypedParameter>
-{
-    CYTypedIdentifier *typed_;
-
-    CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
-        CYNext<CYTypedParameter>(next),
-        typed_(typed)
-    {
-    }
-
-    CYFunctionParameter *Parameters(CYContext &context);
-    CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
-};
-
 struct CYObjCBlock :
     CYExpression
 {
index d1d033c6aa08975a6c8cef71cdb59ef1dfca1a60..084bf719b3405679ce9a4c8d9508be88133b3ab5 100644 (file)
@@ -474,6 +474,14 @@ void CYLabel::Output(CYOutput &out, CYFlags flags) const {
     statement_->Single(out, CYRight(flags));
 }
 
+void CYLambda::Output(CYOutput &out, CYFlags flags) const {
+    // XXX: this is seriously wrong
+    out << "[](";
+    out << ")->";
+    out << "{";
+    out << "}";
+}
+
 void CYLetStatement::Output(CYOutput &out, CYFlags flags) const {
     out << "let" << ' ' << '(' << *declarations_ << ')';
     code_->Single(out, CYRight(flags));
index 2102091d7c5db32afa42f85400e66f245ec6e3dd..e120123696694e0d0fcfe243452b6cc2ac0cc92e 100644 (file)
@@ -1600,6 +1600,123 @@ struct CYFinally :
     virtual void Output(CYOutput &out) const;
 };
 
+struct CYTypeModifier :
+    CYNext<CYTypeModifier>
+{
+    CYTypeModifier(CYTypeModifier *next) :
+        CYNext<CYTypeModifier>(next)
+    {
+    }
+
+    virtual CYExpression *Replace(CYContext &context) = 0;
+};
+
+struct CYTypeArrayOf :
+    CYTypeModifier
+{
+    CYExpression *size_;
+
+    CYTypeArrayOf(CYExpression *size, CYTypeModifier *next = NULL) :
+        CYTypeModifier(next),
+        size_(size)
+    {
+    }
+
+    CYPrecedence(2)
+
+    virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypeConstant :
+    CYTypeModifier
+{
+    CYTypeConstant(CYTypeModifier *next = NULL) :
+        CYTypeModifier(next)
+    {
+    }
+
+    CYPrecedence(3)
+
+    virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypePointerTo :
+    CYTypeModifier
+{
+    CYTypePointerTo(CYTypeModifier *next = NULL) :
+        CYTypeModifier(next)
+    {
+    }
+
+    CYPrecedence(3)
+
+    virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypeVariable :
+    CYTypeModifier
+{
+    CYExpression *expression_;
+
+    CYTypeVariable(CYExpression *expression) :
+        CYTypeModifier(NULL),
+        expression_(expression)
+    {
+    }
+
+    CYPrecedence(1)
+
+    virtual CYExpression *Replace(CYContext &context);
+};
+
+struct CYTypedIdentifier :
+    CYNext<CYTypedIdentifier>
+{
+    CYIdentifier *identifier_;
+    CYTypeModifier *type_;
+
+    CYTypedIdentifier(CYIdentifier *identifier) :
+        identifier_(identifier),
+        type_(NULL)
+    {
+    }
+};
+
+struct CYTypedParameter :
+    CYNext<CYTypedParameter>
+{
+    CYTypedIdentifier *typed_;
+
+    CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
+        CYNext<CYTypedParameter>(next),
+        typed_(typed)
+    {
+    }
+
+    CYFunctionParameter *Parameters(CYContext &context);
+    CYExpression *TypeSignature(CYContext &context, CYExpression *prefix);
+};
+
+struct CYLambda :
+    CYExpression
+{
+    CYTypeModifier *type_;
+    CYTypedParameter *parameters_;
+    CYStatement *statements_;
+
+    CYLambda(CYTypeModifier *type, CYTypedParameter *parameters, CYStatement *statements) :
+        type_(type),
+        parameters_(parameters),
+        statements_(statements)
+    {
+    }
+
+    CYPrecedence(1)
+
+    virtual CYExpression *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 namespace cy {
 namespace Syntax {
 
index de404d570839ad751158f6180e66e9ed504ba837..7a499f740f34c1ecf8352d5bf98eebbaf3a7ac78 100644 (file)
@@ -521,6 +521,10 @@ CYStatement *CYLabel::Replace(CYContext &context) {
     return this;
 }
 
+CYExpression *CYLambda::Replace(CYContext &context) {
+    return $N2($V("Functor"), $ CYFunctionExpression(NULL, parameters_->Parameters(context), statements_), parameters_->TypeSignature(context, type_->Replace(context)));
+}
+
 CYStatement *CYLetStatement::Replace(CYContext &context) {
     return $E($ CYCall(CYNonLocalize(context, $ CYFunctionExpression(NULL, declarations_->Parameter(context), code_)), declarations_->Argument(context)));
 }
@@ -861,6 +865,30 @@ CYStatement *Try::Replace(CYContext &context) {
 
 } }
 
+CYExpression *CYTypeArrayOf::Replace(CYContext &context) {
+    return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("arrayOf")), $ CYArgument(size_));
+}
+
+CYExpression *CYTypeConstant::Replace(CYContext &context) {
+    return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("constant")));
+}
+
+CYExpression *CYTypePointerTo::Replace(CYContext &context) {
+    return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("pointerTo")));
+}
+
+CYExpression *CYTypeVariable::Replace(CYContext &context) {
+    return expression_;
+}
+
+CYFunctionParameter *CYTypedParameter::Parameters(CYContext &context) { $T(NULL)
+    return $ CYFunctionParameter($ CYDeclaration(typed_->identifier_ ?: context.Unique()), next_->Parameters(context));
+}
+
+CYExpression *CYTypedParameter::TypeSignature(CYContext &context, CYExpression *prefix) { $T(prefix)
+    return next_->TypeSignature(context, $ CYAdd(prefix, typed_->type_->Replace(context)));
+}
+
 CYStatement *CYVar::Replace(CYContext &context) {
     declarations_->Replace(context);
     return $E(declarations_->Compound(context));