X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/21d5f610b933e87b7110d629daddeb8f333dcec9..c15969fd0a6280c60d2f35876b5343004fed2b11:/Cycript.yy.in
diff --git a/Cycript.yy.in b/Cycript.yy.in
index b6f355c..047983b 100644
--- a/Cycript.yy.in
+++ b/Cycript.yy.in
@@ -1,20 +1,20 @@
/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2012 Jay Freeman (saurik)
+ * Copyright (C) 2009-2013 Jay Freeman (saurik)
*/
-/* GNU Lesser General Public License, Version 3 {{{ */
+/* GNU General Public License, Version 3 {{{ */
/*
- * Cycript is free software: you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by the
- * Free Software Foundation, either version 3 of the License, or (at your
- * option) any later version.
+ * Cycript is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
*
- * Cycript is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
- * License for more details.
+ * Cycript is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public License
+ * You should have received a copy of the GNU General Public License
* along with Cycript. If not, see .
**/
/* }}} */
@@ -73,7 +73,6 @@ typedef struct {
CYMember *member_;
CYNull *null_;
CYNumber *number_;
- CYEncodedPart *part_;
CYProgram *program_;
CYProperty *property_;
CYPropertyName *propertyName_;
@@ -82,7 +81,6 @@ typedef struct {
CYString *string_;
CYThis *this_;
CYTrue *true_;
- CYEncodedType *type_;
CYWord *word_;
@begin ObjectiveC
@@ -92,6 +90,9 @@ typedef struct {
CYMessageParameter *messageParameter_;
CYProtocol *protocol_;
CYSelectorPart *selector_;
+ CYTypeModifier *type_;
+ CYTypedIdentifier *typedIdentifier_;
+ CYTypedParameter *typedParameter_;
@end
@begin E4X
@@ -471,6 +472,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
%type ClassProtocolListOpt
%type ClassProtocols
%type ClassProtocolsOpt
+%type EncodedType
%type MessageExpression
%type MessageParameter
%type MessageParameters
@@ -478,8 +480,9 @@ int cylex(YYSTYPE *, cy::location *, void *);
%type MessageParameterListOpt
%type MessageScope
%type ModifiedType
-%type NamedTypeOpt
-%type PrefixedType
+%type PrefixedType
+%type PrimitiveType
+%type QualifiedType
%type SelectorCall_
%type SelectorCall
%type SelectorExpression_
@@ -487,9 +490,12 @@ int cylex(YYSTYPE *, cy::location *, void *);
%type SelectorExpressionOpt
%type SelectorList
%type SelectorWordOpt
-%type SuffixedType
+%type SuffixedType
%type TypeOpt
-%type TypedIdentifier
+%type TypedIdentifier
+%type TypedParameterList_
+%type TypedParameterList
+%type TypedParameterListOpt
%type VariadicCall
@end
@@ -551,8 +557,10 @@ LexNoFunction
: { if (yychar == yyempty_) driver.no_.Function = true; else if (yychar == token::Function) yychar = token::Function_; }
;
-LexNoAtImplementation
- : { if (yychar == yyempty_) driver.no_.AtImplementation = true; else if (yychar == token::AtImplementation) yychar = token::AtImplementation_; }
+LexNoAtImplementation :
+@begin ObjectiveC
+ { if (yychar == yyempty_) driver.no_.AtImplementation = true; else if (yychar == token::AtImplementation) yychar = token::AtImplementation_; }
+@end
;
LexSetStatement
@@ -717,7 +725,7 @@ TerminatorOpt
/* 11.1 Primary Expressions {{{ */
Parenthetical
- : "(" LexPushInOff Expression LexPopIn ")" { $$ = $3; }
+ : "(" LexPushInOff Expression ")" LexPopIn { $$ = $3; }
;
ParentheticalOpt
@@ -742,7 +750,7 @@ PrimaryExpression
/* }}} */
/* 11.1.4.1 Array Initialiser {{{ */
ArrayLiteral
- : "[" LexPushInOff ElementListOpt LexPopIn "]" { $$ = CYNew CYArray($3); }
+ : "[" LexPushInOff ElementListOpt "]" LexPopIn { $$ = CYNew CYArray($3); }
;
Element
@@ -766,7 +774,7 @@ ElementListOpt
/* }}} */
/* 11.1.4.2 Array Comprehension {{{ */
PrimaryExpression
- : "[" LexPushInOff AssignmentExpression ComprehensionForList LexPopIn "]" { $$ = CYNew CYArrayComprehension($3, $4); }
+ : "[" LexPushInOff AssignmentExpression ComprehensionForList "]" LexPopIn { $$ = CYNew CYArrayComprehension($3, $4); }
;
ComprehensionForList
@@ -782,12 +790,12 @@ ComprehensionForListOpt
/* }}} */
/* 11.1.5 Object Initialiser {{{ */
ObjectLiteral
- : BRACE LexPushInOff PropertyDefinitionListOpt LexPopIn "}" { $$ = CYNew CYObject($3); }
+ : BRACE LexPushInOff PropertyDefinitionListOpt "}" LexPopIn { $$ = CYNew CYObject($3); }
;
PropertyDefinitionList_
: "," PropertyDefinitionList { $$ = $2; }
- | "," { $$ = NULL; }
+ | "," LexSetRegExp { $$ = NULL; }
| { $$ = NULL; }
;
@@ -797,7 +805,7 @@ PropertyDefinitionList
PropertyDefinitionListOpt
: PropertyDefinitionList { $$ = $1; }
- | { $$ = NULL; }
+ | LexSetRegExp { $$ = NULL; }
;
PropertyDefinition
@@ -820,7 +828,7 @@ PropertyName
/* 11.2 Left-Hand-Side Expressions {{{ */
MemberAccess
- : "[" LexPushInOff Expression LexPopIn "]" { $$ = CYNew CYDirectMember(NULL, $3); }
+ : "[" LexPushInOff Expression "]" LexPopIn { $$ = CYNew CYDirectMember(NULL, $3); }
| "." IdentifierName { $$ = CYNew CYDirectMember(NULL, CYNew CYString($2)); }
| "." AutoComplete { driver.mode_ = CYDriver::AutoDirect; YYACCEPT; }
;
@@ -852,7 +860,7 @@ CallExpression
;
Arguments
- : "(" LexPushInOff ArgumentListOpt LexPopIn ")" { $$ = $3; }
+ : "(" LexPushInOff ArgumentListOpt ")" LexPopIn { $$ = $3; }
;
ArgumentList_
@@ -974,7 +982,7 @@ LogicalORExpression
/* 11.12 Conditional Operator ( ? : ) {{{ */
ConditionalExpression
: LogicalORExpression { $$ = $1; }
- | LogicalORExpression "?" LexPushInOff AssignmentExpression LexPopIn ":" AssignmentExpression { $$ = CYNew CYCondition($1, $4, $7); }
+ | LogicalORExpression "?" LexPushInOff AssignmentExpression ":" LexPopIn AssignmentExpression { $$ = CYNew CYCondition($1, $4, $7); }
;
/* }}} */
/* 11.13 Assignment Operators {{{ */
@@ -1173,7 +1181,7 @@ IterationStatement
/* }}} */
/* 12.6.3 The for Statement {{{ */
IterationStatement
- : "for" "(" LexPushInOn ForStatementInitialiser LexPopIn ";" ExpressionOpt ";" ExpressionOpt ")" Statement { $$ = CYNew CYFor($4, $7, $9, $11); }
+ : "for" "(" LexPushInOn ForStatementInitialiser ";" LexPopIn ExpressionOpt ";" ExpressionOpt ")" Statement { $$ = CYNew CYFor($4, $7, $9, $11); }
;
ForStatementInitialiser
@@ -1183,8 +1191,8 @@ ForStatementInitialiser
/* }}} */
/* 12.6.4 The for-in and for-of Statements {{{ */
IterationStatement
- : "for" "(" LexPushInOn ForInStatementInitialiser LexPopIn "!in" Expression ")" Statement { $$ = CYNew CYForIn($4, $7, $9); }
- | "for" "(" LexPushInOn ForInStatementInitialiser LexPopIn "of" Expression ")" Statement { $$ = CYNew CYForOf($4, $7, $9); }
+ : "for" "(" LexPushInOn ForInStatementInitialiser "!in" LexPopIn Expression ")" Statement { $$ = CYNew CYForIn($4, $7, $9); }
+ | "for" "(" LexPushInOn ForInStatementInitialiser "of" LexPopIn Expression ")" Statement { $$ = CYNew CYForOf($4, $7, $9); }
;
ForInStatementInitialiser
@@ -1207,7 +1215,7 @@ BreakStatement
/* }}} */
/* 12.9 The return Statement {{{ */
ReturnStatement
- : "return" "\n" StrictSemi { $$ = CYNew CYReturn(NULL); }
+ : "return" LexSetRegExp "\n" StrictSemi { $$ = CYNew CYReturn(NULL); }
| "return" ExpressionOpt Terminator { $$ = CYNew CYReturn($2); }
;
/* }}} */
@@ -1247,7 +1255,7 @@ LabelledStatement
/* }}} */
/* 12.13 The throw Statement {{{ */
ThrowStatement
- : "throw" "\n" StrictSemi { YYABORT; }
+ : "throw" LexSetRegExp "\n" StrictSemi { YYABORT; }
| "throw" Expression Terminator { $$ = CYNew cy::Syntax::Throw($2); }
;
/* }}} */
@@ -1278,7 +1286,7 @@ FunctionDeclaration
;
FunctionExpression
- : "function" IdentifierOpt "(" LexPushInOff FormalParameterListOpt LexPopIn ")" BRACE LexPushInOff FunctionBody LexPopIn "}" { $$ = CYNew CYFunctionExpression($2, $5, $10); }
+ : "function" IdentifierOpt "(" LexPushInOff FormalParameterListOpt ")" LexPopIn BRACE LexPushInOff FunctionBody "}" LexPopIn { $$ = CYNew CYFunctionExpression($2, $5, $10); }
;
FormalParameterList_
@@ -1320,7 +1328,7 @@ ArrowParameters
ConciseBody
: AssignmentExpression { $$ = CYNew CYReturn($1); }
- | ";{" LexPushInOff FunctionBody LexPopIn "}" { $$ = $3; }
+ | LexSetRegExp ";{" LexPushInOff FunctionBody "}" LexPopIn { $$ = $4; }
;
/* }}} */
/* 14 Program {{{ */
@@ -1340,33 +1348,44 @@ ProgramBodyOpt
@begin ObjectiveC
/* Cycript (Objective-C): Type Encoding {{{ */
-NamedTypeOpt
- : Identifier { $$ = CYNew CYEncodedPart(NULL, "withName", CYNew CYArgument(CYNew CYString($1->word_))); }
- | { $$ = NULL; }
- ;
-
SuffixedType
- : NamedTypeOpt { $$ = $1; }
- | "(" PrefixedType ")" { $$ = $2; }
- | SuffixedType "[" NumericLiteral "]" { $$ = CYNew CYEncodedPart($1, "arrayOf", CYNew CYArgument($3)); }
+ : IdentifierOpt { $$ = CYNew CYTypedIdentifier($1); }
+ | "(" LexPushInOff PrefixedType ")" LexPopIn { $$ = $3; }
+ | SuffixedType "[" NumericLiteral "]" { CYSetLast($1->type_) = CYNew CYTypeArrayOf($3); $$ = $1; }
;
PrefixedType
: SuffixedType { $$ = $1; }
- | "*" PrefixedType { $$ = CYNew CYEncodedPart($2, "pointerTo"); }
+ | "const" PrefixedType { CYSetLast($2->type_) = CYNew CYTypeConstant(); $$ = $2; }
+ | "*" PrefixedType { CYSetLast($2->type_) = CYNew CYTypePointerTo(); $$ = $2; }
+ ;
+
+PrimitiveType
+ : Variable { $$ = $1; }
+ | "void" { $$ = CYNew cy::Syntax::New(CYNew CYVariable(CYNew CYIdentifier("Type")), CYNew CYArgument(CYNew CYString("v"))); }
+ ;
+
+QualifiedType
+ : PrimitiveType { $$ = CYNew CYTypeVariable($1); }
+ | "const" QualifiedType { $$ = CYNew CYTypeConstant($2); }
;
ModifiedType
- : Variable { $$ = CYNew CYEncodedType($1); }
- | "const" ModifiedType { $2->base_ = CYNew CYCall(CYNew CYDirectMember($2->base_, CYNew CYString("constant"))); $$ = $2; }
+ : QualifiedType { $$ = $1; }
+ | QualifiedType "*" { $$ = CYNew CYTypePointerTo($1); }
+ | QualifiedType "const" { $$ = CYNew CYTypeConstant($1); }
;
TypedIdentifier
- : ModifiedType PrefixedType { $1->parts_ = $2; $$ = $1;}
+ : QualifiedType PrefixedType { CYSetLast($2->type_) = $1; $$ = $2;}
+ ;
+
+EncodedType
+ : TypedIdentifier { $$ = CYNew CYEncodedType($1->type_); }
;
PrimaryExpression
- : AtEncode "(" TypedIdentifier ")" { $$ = $3; }
+ : AtEncode "(" EncodedType ")" { $$ = $3; }
;
/* }}} */
/* Cycript (Objective-C): @class Declaration {{{ */
@@ -1378,7 +1397,7 @@ ClassSuperOpt
ClassFieldListOpt
: Expression Identifier ";" ClassFieldListOpt { $$ = CYNew CYField($1, $2, $4); }
- | { $$ = NULL; }
+ | LexSetRegExp { $$ = NULL; }
;
ClassFields
@@ -1391,8 +1410,7 @@ MessageScope
;
TypeOpt
- : "(" TypedIdentifier ")" { $$ = $2; }
- | "(" LexSetRegExp "void" ")" { $$ = CYNew CYString("v"); }
+ : "(" LexSetRegExp EncodedType ")" { $$ = $3; }
| { $$ = NULL; }
;
@@ -1450,7 +1468,7 @@ ClassProtocolListOpt
;
ClassExpression
- : "@implementation" LexPushInOff ClassNameOpt ClassSuperOpt ClassProtocolListOpt ClassFields ClassMessageDeclarationListOpt LexPopIn "@end" { $$ = CYNew CYClassExpression($3, $4, $5, $6, $7); }
+ : "@implementation" LexPushInOff ClassNameOpt ClassSuperOpt ClassProtocolListOpt ClassFields ClassMessageDeclarationListOpt "@end" LexPopIn { $$ = CYNew CYClassExpression($3, $4, $5, $6, $7); }
;
ClassStatement
@@ -1500,8 +1518,8 @@ SelectorList
;
MessageExpression
- : "[" LexPushInOff AssignmentExpression { driver.contexts_.push_back($3); } SelectorList LexPopIn "]" { driver.contexts_.pop_back(); } { $$ = CYNew CYSendDirect($3, $5); }
- | "[" LexPushInOff LexSetRegExp "super" { driver.context_ = NULL; } SelectorList LexPopIn "]" { $$ = CYNew CYSendSuper($6); }
+ : "[" LexPushInOff AssignmentExpression { driver.contexts_.push_back($3); } SelectorList "]" LexPopIn { driver.contexts_.pop_back(); } { $$ = CYNew CYSendDirect($3, $5); }
+ | "[" LexPushInOff LexSetRegExp "super" { driver.context_ = NULL; } SelectorList "]" LexPopIn { $$ = CYNew CYSendSuper($6); }
;
SelectorExpression_
@@ -1520,7 +1538,7 @@ SelectorExpressionOpt
PrimaryExpression
: MessageExpression { $$ = $1; }
- | "@selector" "(" LexPushInOff SelectorExpression LexPopIn ")" { $$ = CYNew CYSelector($4); }
+ | "@selector" "(" LexPushInOff SelectorExpression ")" LexPopIn { $$ = CYNew CYSelector($4); }
;
/* }}} */
/* Cycript (Objective-C): @import Directive {{{ */
@@ -1555,6 +1573,25 @@ PrimaryExpression
: "@" BoxableExpression { $$ = CYNew CYBox($2); }
;
/* }}} */
+/* 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); }
+ ;
+/* }}} */
@end
@begin C
@@ -1653,7 +1690,7 @@ AttributeIdentifier
PropertySelector_
: PropertySelector { $$ = $1; }
- | "[" LexPushInOff Expression LexPopIn "]" { $$ = CYNew CYSelector($3); }
+ | "[" LexPushInOff Expression "]" LexPopIn { $$ = CYNew CYSelector($3); }
;
PropertySelector
@@ -1683,8 +1720,8 @@ XMLInitialiser
;
XMLElement
- : "<" LexPushInOff XMLTagContent LexPop LexPopIn "/>"
- | "<" LexPushInOff XMLTagContent ">" LexSetXMLContent XMLElementContentOpt "" LexSetXMLTag XMLTagName XMLWhitespaceOpt LexPop LexPopIn ">"
+ : "<" LexPushInOff XMLTagContent LexPop "/>" LexPopIn
+ | "<" LexPushInOff XMLTagContent ">" LexSetXMLContent XMLElementContentOpt "" LexSetXMLTag XMLTagName XMLWhitespaceOpt LexPop ">" LexPopIn
;
XMLTagContent
@@ -1733,7 +1770,7 @@ XMLElementContentOpt
/* }}} */
/* 11.1.5 XMLList Initialiser {{{ */
XMLListInitialiser
- : "<>" LexPushInOff LexPushXMLContent XMLElementContent LexPop LexPopIn ">" { $$ = CYNew CYXMLList($4); }
+ : "<>" LexPushInOff LexPushXMLContent XMLElementContent LexPop ">" LexPopIn { $$ = CYNew CYXMLList($4); }
;
/* }}} */
@@ -1781,12 +1818,12 @@ ComprehensionListOpt
;
PrimaryExpression
- : "[" LexPushInOff AssignmentExpression ComprehensionList LexPopIn "]" { $$ = CYNew CYArrayComprehension($3, $4); }
+ : "[" LexPushInOff AssignmentExpression ComprehensionList "]" LexPopIn { $$ = CYNew CYArrayComprehension($3, $4); }
;
/* }}} */
/* JavaScript 1.7: for each {{{ */
IterationStatement
- : "for" "each" "(" LexPushInOn ForInStatementInitialiser LexPopIn "!in" Expression ")" Statement { $$ = CYNew CYForOf($5, $8, $10); }
+ : "for" "each" "(" LexPushInOn ForInStatementInitialiser "!in" LexPopIn Expression ")" Statement { $$ = CYNew CYForOf($5, $8, $10); }
;
/* }}} */
/* JavaScript 1.7: let Statements {{{ */
@@ -1825,7 +1862,7 @@ RubyProcExpression
;
PrimaryExpression
- : "{" LexPushInOff RubyProcParameters StatementListOpt LexPopIn "}" { $$ = CYNew CYRubyProc($3, $4); }
+ : "{" LexPushInOff RubyProcParameters StatementListOpt "}" LexPopIn { $$ = CYNew CYRubyProc($3, $4); }
;
CallExpression