X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/82a02edec66cecb6ab494865736e5d75519b81db..7935799653507b33ee117bdacd2691a2b7210528:/Cycript.yy.in
diff --git a/Cycript.yy.in b/Cycript.yy.in
index 3f240e4..14f6aad 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 .
**/
/* }}} */
@@ -28,6 +28,7 @@
@if Bison24 }
@if Bison24 %code requires {
+#include "Driver.hpp"
#include "Parser.hpp"
#define CYNew new($pool)
@@ -90,6 +91,9 @@ typedef struct {
CYMessageParameter *messageParameter_;
CYProtocol *protocol_;
CYSelectorPart *selector_;
+ CYTypeModifier *type_;
+ CYTypedIdentifier *typedIdentifier_;
+ CYTypedParameter *typedParameter_;
@end
@begin E4X
@@ -228,6 +232,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
%token AtImplementation "@implementation"
%token AtImplementation_ ";@implementation"
%token AtImport "@import"
+%token AtEncode "@encode"
%token AtEnd "@end"
%token AtSelector "@selector"
@end
@@ -451,6 +456,7 @@ int cylex(YYSTYPE *, cy::location *, void *);
%type WithStatement
%type Word
%type WordOpt
+%type Variable
@begin ObjectiveC
%type BoxableExpression
@@ -467,12 +473,17 @@ int cylex(YYSTYPE *, cy::location *, void *);
%type ClassProtocolListOpt
%type ClassProtocols
%type ClassProtocolsOpt
+%type EncodedType
%type MessageExpression
%type MessageParameter
%type MessageParameters
%type MessageParameterList
%type MessageParameterListOpt
%type MessageScope
+%type ModifiedType
+%type PrefixedType
+%type PrimitiveType
+%type QualifiedType
%type SelectorCall_
%type SelectorCall
%type SelectorExpression_
@@ -480,7 +491,12 @@ int cylex(YYSTYPE *, cy::location *, void *);
%type SelectorExpressionOpt
%type SelectorList
%type SelectorWordOpt
+%type SuffixedType
%type TypeOpt
+%type TypedIdentifier
+%type TypedParameterList_
+%type TypedParameterList
+%type TypedParameterListOpt
%type VariadicCall
@end
@@ -542,8 +558,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
@@ -708,7 +726,7 @@ TerminatorOpt
/* 11.1 Primary Expressions {{{ */
Parenthetical
- : "(" LexPushInOff Expression LexPopIn ")" { $$ = $3; }
+ : "(" LexPushInOff Expression ")" LexPopIn { $$ = $3; }
;
ParentheticalOpt
@@ -716,9 +734,13 @@ ParentheticalOpt
| { $$ = NULL; }
;
+Variable
+ : Identifier { $$ = CYNew CYVariable($1); }
+ ;
+
PrimaryExpression
: "this" { $$ = $1; }
- | Identifier { $$ = CYNew CYVariable($1); }
+ | Variable { $$ = $1; }
| Literal { $$ = $1; }
| ArrayLiteral { $$ = $1; }
| ObjectLiteral { $$ = $1; }
@@ -729,7 +751,7 @@ PrimaryExpression
/* }}} */
/* 11.1.4.1 Array Initialiser {{{ */
ArrayLiteral
- : "[" LexPushInOff ElementListOpt LexPopIn "]" { $$ = CYNew CYArray($3); }
+ : "[" LexPushInOff ElementListOpt "]" LexPopIn { $$ = CYNew CYArray($3); }
;
Element
@@ -753,7 +775,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
@@ -769,12 +791,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; }
;
@@ -784,7 +806,7 @@ PropertyDefinitionList
PropertyDefinitionListOpt
: PropertyDefinitionList { $$ = $1; }
- | { $$ = NULL; }
+ | LexSetRegExp { $$ = NULL; }
;
PropertyDefinition
@@ -807,7 +829,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; }
;
@@ -839,7 +861,7 @@ CallExpression
;
Arguments
- : "(" LexPushInOff ArgumentListOpt LexPopIn ")" { $$ = $3; }
+ : "(" LexPushInOff ArgumentListOpt ")" LexPopIn { $$ = $3; }
;
ArgumentList_
@@ -961,7 +983,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 {{{ */
@@ -1160,7 +1182,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
@@ -1170,8 +1192,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
@@ -1194,7 +1216,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); }
;
/* }}} */
@@ -1234,7 +1256,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); }
;
/* }}} */
@@ -1265,7 +1287,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_
@@ -1307,7 +1329,7 @@ ArrowParameters
ConciseBody
: AssignmentExpression { $$ = CYNew CYReturn($1); }
- | ";{" LexPushInOff FunctionBody LexPopIn "}" { $$ = $3; }
+ | LexSetRegExp ";{" LexPushInOff FunctionBody "}" LexPopIn { $$ = $4; }
;
/* }}} */
/* 14 Program {{{ */
@@ -1326,6 +1348,47 @@ ProgramBodyOpt
/* }}} */
@begin ObjectiveC
+/* Cycript (Objective-C): Type Encoding {{{ */
+SuffixedType
+ : IdentifierOpt { $$ = CYNew CYTypedIdentifier($1); }
+ | "(" LexPushInOff PrefixedType ")" LexPopIn { $$ = $3; }
+ | SuffixedType "[" NumericLiteral "]" { CYSetLast($1->type_) = CYNew CYTypeArrayOf($3); $$ = $1; }
+ ;
+
+PrefixedType
+ : SuffixedType { $$ = $1; }
+ | "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
+ : QualifiedType { $$ = $1; }
+ | QualifiedType "*" { $$ = CYNew CYTypePointerTo($1); }
+ | QualifiedType "const" { $$ = CYNew CYTypeConstant($1); }
+ ;
+
+TypedIdentifier
+ : QualifiedType PrefixedType { CYSetLast($2->type_) = $1; $$ = $2;}
+ ;
+
+EncodedType
+ : TypedIdentifier { $$ = CYNew CYEncodedType($1->type_); }
+ ;
+
+PrimaryExpression
+ : AtEncode "(" EncodedType ")" { $$ = $3; }
+ ;
+/* }}} */
/* Cycript (Objective-C): @class Declaration {{{ */
ClassSuperOpt
/* XXX: why the hell did I choose MemberExpression? */
@@ -1335,7 +1398,7 @@ ClassSuperOpt
ClassFieldListOpt
: Expression Identifier ";" ClassFieldListOpt { $$ = CYNew CYField($1, $2, $4); }
- | { $$ = NULL; }
+ | LexSetRegExp { $$ = NULL; }
;
ClassFields
@@ -1348,8 +1411,7 @@ MessageScope
;
TypeOpt
- : "(" Expression ")" { $$ = $2; }
- | "(" LexSetRegExp "void" ")" { $$ = CYNew CYString("v"); }
+ : "(" LexSetRegExp EncodedType ")" { $$ = $3; }
| { $$ = NULL; }
;
@@ -1407,7 +1469,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
@@ -1457,8 +1519,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_
@@ -1477,7 +1539,7 @@ SelectorExpressionOpt
PrimaryExpression
: MessageExpression { $$ = $1; }
- | "@selector" "(" LexPushInOff SelectorExpression LexPopIn ")" { $$ = CYNew CYSelector($4); }
+ | "@selector" "(" LexPushInOff SelectorExpression ")" LexPopIn { $$ = CYNew CYSelector($4); }
;
/* }}} */
/* Cycript (Objective-C): @import Directive {{{ */
@@ -1512,6 +1574,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
@@ -1610,7 +1691,7 @@ AttributeIdentifier
PropertySelector_
: PropertySelector { $$ = $1; }
- | "[" LexPushInOff Expression LexPopIn "]" { $$ = CYNew CYSelector($3); }
+ | "[" LexPushInOff Expression "]" LexPopIn { $$ = CYNew CYSelector($3); }
;
PropertySelector
@@ -1640,8 +1721,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
@@ -1690,7 +1771,7 @@ XMLElementContentOpt
/* }}} */
/* 11.1.5 XMLList Initialiser {{{ */
XMLListInitialiser
- : "<>" LexPushInOff LexPushXMLContent XMLElementContent LexPop LexPopIn ">" { $$ = CYNew CYXMLList($4); }
+ : "<>" LexPushInOff LexPushXMLContent XMLElementContent LexPop ">" LexPopIn { $$ = CYNew CYXMLList($4); }
;
/* }}} */
@@ -1738,12 +1819,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 {{{ */
@@ -1782,7 +1863,7 @@ RubyProcExpression
;
PrimaryExpression
- : "{" LexPushInOff RubyProcParameters StatementListOpt LexPopIn "}" { $$ = CYNew CYRubyProc($3, $4); }
+ : "{" LexPushInOff RubyProcParameters StatementListOpt "}" LexPopIn { $$ = CYNew CYRubyProc($3, $4); }
;
CallExpression