]> git.saurik.com Git - cycript.git/commitdiff
Add syntax to support C-style typedef assignment.
authorJay Freeman (saurik) <saurik@saurik.com>
Mon, 6 Jan 2014 13:59:44 +0000 (05:59 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Mon, 6 Jan 2014 13:59:44 +0000 (05:59 -0800)
Cycript.l.in
Cycript.yy.in
Output.cpp
Parser.hpp
Replace.cpp

index cb422ccfca62add4cbcc7fa19f9221c74393da40..5915fc95272fb34a4d7f61fa74b6c9e641bb6cb1 100644 (file)
@@ -257,6 +257,10 @@ XMLName {XMLNameStart}{XMLNamePart}*
 "@class"          L C F(tk::AtClass, hi::Meta);
 @end
 
+@begin C
+"typedef"         L C I(identifier, Identifier("typedef"), tk::Typedef, hi::Meta);
+@end
+
 @begin ObjectiveC
 "@encode"         L C F(tk::AtEncode, hi::Meta);
 "@end"            L C F(tk::AtEnd, hi::Meta);
index 8fd76aacf258f3f8cdf7c06b9e975ecef630218d..8adbbf5fe96c0431db20311601e0e1f90db9eafc 100644 (file)
@@ -230,6 +230,10 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %token AtClass "@class"
 @end
 
+@begin C
+%token <identifier_> Typedef "typedef"
+@end
+
 @begin ObjectiveC
 %token AtImplementation "@implementation"
 %token AtImplementation_ ";@implementation"
@@ -645,6 +649,10 @@ WordOpt
 Identifier
     : Identifier_ { $$ = $1; }
 
+@begin C
+    | "typedef" { $$ = $1; }
+@end
+
     | "implements" { $$ = $1; }
     | "interface" { $$ = $1; }
     | "package" { $$ = $1; }
@@ -1623,6 +1631,11 @@ PrimaryExpression
     : "[" LexPushInOff LexSetRegExp "=" "]" LexPopIn "(" LexPushInOff TypedParameterListOpt ")" LexPopIn "->" ModifiedType BRACE LexPushInOff FunctionBody "}" LexPopIn { $$ = CYNew CYLambda($13, $9, $16); }
     ;
 /* }}} */
+/* Cycript (C): Type Definitions {{{ */
+Statement__
+    : "typedef" TypedIdentifier Terminator { $$ = CYNew CYTypeDefinition($2); }
+    ;
+/* }}} */
 @end
 
 /* YUI: Documentation Comments {{{ */
index 084bf719b3405679ce9a4c8d9508be88133b3ab5..3bf157f0e0df4ab8b605488abccca1118d05447d 100644 (file)
@@ -474,6 +474,11 @@ void CYLabel::Output(CYOutput &out, CYFlags flags) const {
     statement_->Single(out, CYRight(flags));
 }
 
+void CYTypedIdentifier::Output(CYOutput &out) const {
+    // XXX: this is clearly wrong
+    out << "XXX";
+}
+
 void CYLambda::Output(CYOutput &out, CYFlags flags) const {
     // XXX: this is seriously wrong
     out << "[](";
@@ -482,6 +487,10 @@ void CYLambda::Output(CYOutput &out, CYFlags flags) const {
     out << "}";
 }
 
+void CYTypeDefinition::Output(CYOutput &out, CYFlags flags) const {
+    out << "typedef" << *typed_;
+}
+
 void CYLetStatement::Output(CYOutput &out, CYFlags flags) const {
     out << "let" << ' ' << '(' << *declarations_ << ')';
     code_->Single(out, CYRight(flags));
index e120123696694e0d0fcfe243452b6cc2ac0cc92e..110cf0d6205901612ee788142945968cd1ef32a4 100644 (file)
@@ -1670,7 +1670,8 @@ struct CYTypeVariable :
 };
 
 struct CYTypedIdentifier :
-    CYNext<CYTypedIdentifier>
+    CYNext<CYTypedIdentifier>,
+    CYThing
 {
     CYIdentifier *identifier_;
     CYTypeModifier *type_;
@@ -1680,6 +1681,8 @@ struct CYTypedIdentifier :
         type_(NULL)
     {
     }
+
+    virtual void Output(CYOutput &out) const;
 };
 
 struct CYTypedParameter :
@@ -1717,6 +1720,20 @@ struct CYLambda :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYTypeDefinition :
+    CYStatement
+{
+    CYTypedIdentifier *typed_;
+
+    CYTypeDefinition(CYTypedIdentifier *typed) :
+        typed_(typed)
+    {
+    }
+
+    virtual CYStatement *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 namespace cy {
 namespace Syntax {
 
index 7a499f740f34c1ecf8352d5bf98eebbaf3a7ac78..a4a31eaac6b286f065311e5a5765d147c92819dd 100644 (file)
@@ -873,6 +873,10 @@ CYExpression *CYTypeConstant::Replace(CYContext &context) {
     return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("constant")));
 }
 
+CYStatement *CYTypeDefinition::Replace(CYContext &context) {
+    return $E($ CYAssign($V(typed_->identifier_), typed_->type_->Replace(context)));
+}
+
 CYExpression *CYTypePointerTo::Replace(CYContext &context) {
     return $ CYCall($ CYDirectMember(next_->Replace(context), $ CYString("pointerTo")));
 }