]> git.saurik.com Git - cycript.git/blobdiff - Cycript.y
Started work on array comprehensions, implemented multi-line string literals (not...
[cycript.git] / Cycript.y
index 7b1399d96832e36cef7563a4c0ad7140f1c448c2..dd0ea51da91105c8c09b1438853205e0aaa20d7f 100644 (file)
--- a/Cycript.y
+++ b/Cycript.y
@@ -269,10 +269,12 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner);
 %type <clause_> CaseClause
 %type <clause_> CaseClausesOpt
 %type <catch_> CatchOpt
-%type <source_> ClassDeclaration
+%type <statement_> CategoryStatement
+%type <expression_> ClassExpression
 %type <message_> ClassMessageDeclaration
 %type <message_> ClassMessageDeclarationListOpt
 %type <className_> ClassName
+%type <className_> ClassNameOpt
 %type <expression_> ClassSuperOpt
 %type <field_> ClassFieldList
 %type <expression_> ConditionalExpression
@@ -986,7 +988,7 @@ Statement
     ;
 
 Block
-    : "{" StatementListOpt "}" { $$ = $2 ?: new(driver.pool_) CYEmpty(); }
+    : "{" StatementListOpt "}" { if ($2) $$ = new(driver.pool_) CYBlock($2); else $$ = new(driver.pool_) CYEmpty(); }
     ;
 
 StatementList
@@ -1244,13 +1246,25 @@ ClassName
     | "(" AssignmentExpression ")" { $$ = $2; }
     ;
 
-ClassDeclaration
-    : "@class" Identifier ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new CYClass($2, $3, $4, $5); }
-    | "@class" ClassName ClassMessageDeclarationListOpt "@end" { $$ = new CYCategory($2, $3); }
+ClassNameOpt
+    : ClassName { $$ = $1; }
+    | { $$ = NULL; }
     ;
 
-SourceElement
-    : ClassDeclaration { $$ = $1; }
+ClassExpression
+    : "@class" ClassNameOpt ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new CYClass($2, $3, $4, $5); }
+    ;
+
+CategoryStatement
+    : "@class" ClassName ClassMessageDeclarationListOpt "@end" { $$ = new CYCategory($2, $3); }
+    ;
+
+PrimaryExpression_
+    : ClassExpression { $$ = $1; }
+    ;
+
+Statement
+    : CategoryStatement
     ;
 
 VariadicCall
@@ -1308,4 +1322,30 @@ MemberAccess
     : "->" Identifier { $$ = new(driver.pool_) CYIndirectMember(NULL, new(driver.pool_) CYString($2)); }
     ;
 
+/*
+
+IfComprehension
+    : "if" "(" Expression ")"
+    ;
+
+ForComprehension
+    : "for" "(" ForInStatementInitialiser "in" Expression ")"
+    ;
+
+ComprehensionListOpt
+    : ComprehensionList
+    | IfComprehension
+    |
+    ;
+
+ComprehensionList
+    : ForComprehension ComprehensionListOpt
+    ;
+
+PrimaryExpression_
+    : "[" AssignmentExpression ComprehensionList "]"
+    ;
+
+*/
+
 %%