X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/cde525f7e0bded621b0c3f39dfbbc5f49e067dac..f7c38a297012f1f25c59243d39a5a6dc31da4cf7:/Cycript.y diff --git a/Cycript.y b/Cycript.y index 4b90f42..a82e7f8 100644 --- a/Cycript.y +++ b/Cycript.y @@ -1,3 +1,42 @@ +/* Cycript - Remove Execution Server and Disassembler + * Copyright (C) 2009 Jay Freeman (saurik) +*/ + +/* Modified BSD License {{{ */ +/* + * Redistribution and use in source and binary + * forms, with or without modification, are permitted + * provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the + * above copyright notice, this list of conditions + * and the following disclaimer. + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions + * and the following disclaimer in the documentation + * and/or other materials provided with the + * distribution. + * 3. The name of the author may not be used to endorse + * or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ +/* }}} */ + %code top { #include "Cycript.tab.hh" #define scanner driver.scanner_ @@ -11,6 +50,8 @@ typedef struct { bool newline_; union { + bool bool_; + CYArgument *argument_; CYBoolean *boolean_; CYClause *clause_; @@ -21,14 +62,17 @@ typedef struct { CYElement *element_; CYExpression *expression_; CYFalse *false_; + CYField *field_; CYForInitialiser *for_; CYForInInitialiser *forin_; + CYFunctionParameter *functionParameter_; CYIdentifier *identifier_; CYLiteral *literal_; + CYMessage *message_; + CYMessageParameter *messageParameter_; CYName *name_; CYNull *null_; CYNumber *number_; - CYParameter *parameter_; CYProperty *property_; CYSelectorPart *selector_; CYSource *source_; @@ -120,8 +164,8 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %token OpenBracket "[" %token CloseBracket "]" +%token AtClass "@class" %token AtSelector "@selector" -%token AtImplementation "@implementation" %token AtEnd "@end" %token Break "break" @@ -217,6 +261,11 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type CaseClause %type CaseClausesOpt %type CatchOpt +%type ClassDeclaration +%type ClassMessageDeclaration +%type ClassMessageDeclarationListOpt +%type ClassSuperOpt +%type ClassFieldList %type ConditionalExpression %type ConditionalExpressionNoBF %type ConditionalExpressionNoIn @@ -245,8 +294,8 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type ForStatementInitialiser %type ForInStatement %type ForInStatementInitialiser -%type FormalParameterList -%type FormalParameterList_ +%type FormalParameterList +%type FormalParameterList_ %type FunctionBody %type FunctionDeclaration %type FunctionExpression @@ -271,6 +320,11 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type MemberExpression %type MemberExpression_ %type MemberExpressionNoBF +%type MessageParameter +%type MessageParameters +%type MessageParameterList +%type MessageParameterListOpt +%type MessageScope %type MultiplicativeExpression %type MultiplicativeExpressionNoBF %type NewExpression @@ -305,6 +359,7 @@ int cylex(YYSTYPE *lvalp, cy::location *llocp, void *scanner); %type SwitchStatement %type ThrowStatement %type TryStatement +%type TypeOpt %type UnaryExpression %type UnaryExpression_ %type UnaryExpressionNoBF @@ -1103,7 +1158,7 @@ FormalParameterList_ ; FormalParameterList - : Identifier FormalParameterList_ { $$ = new(driver.pool_) CYParameter($1, $2); } + : Identifier FormalParameterList_ { $$ = new(driver.pool_) CYFunctionParameter($1, $2); } | { $$ = NULL; } ; @@ -1126,6 +1181,60 @@ SourceElement ; /* Objective-C Extensions {{{ */ +ClassSuperOpt + : ":" MemberExpressionNoBF { $$ = $2; } + | { $$ = NULL; } + ; + +ClassFieldList + : "{" "}" { $$ = NULL; } + ; + +MessageScope + : "+" { $$ = false; } + | "-" { $$ = true; } + ; + +TypeOpt + : "(" Expression ")" { $$ = $2; } + | { $$ = NULL; } + ; + +MessageParameter + : Word ":" TypeOpt Identifier { $$ = new CYMessageParameter($1, $3, $4); } + ; + +MessageParameterListOpt + : MessageParameterList { $$ = $1; } + | { $$ = NULL; } + ; + +MessageParameterList + : MessageParameter MessageParameterListOpt { $1->SetNext($2); $$ = $1; } + ; + +MessageParameters + : MessageParameterList { $$ = $1; } + | Word { $$ = new CYMessageParameter($1, NULL, NULL); } + ; + +ClassMessageDeclaration + : MessageScope TypeOpt MessageParameters "{" FunctionBody "}" { $$ = new CYMessage($1, $2, $3, $5); } + ; + +ClassMessageDeclarationListOpt + : ClassMessageDeclarationListOpt ClassMessageDeclaration { $2->SetNext($1); $$ = $2; } + | { $$ = NULL; } + ; + +ClassDeclaration + : "@class" Identifier ClassSuperOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = new CYClass($2, $3, $4, $5); } + ; + +SourceElement + : ClassDeclaration { $$ = $1; } + ; + VariadicCall : "," AssignmentExpression VariadicCall { $$ = new(driver.pool_) CYArgument(NULL, $2, $3); } | { $$ = NULL; } @@ -1146,7 +1255,7 @@ SelectorList ; MessageExpression - : "[" AssignmentExpression SelectorList "]" { $$ = new(driver.pool_) CYMessage($2, $3); } + : "[" AssignmentExpression SelectorList "]" { $$ = new(driver.pool_) CYSend($2, $3); } ; SelectorExpressionOpt