X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/a87d7060233fff3ecbbc29d0e7e978f3587684ab..5b75838211f16d9c88fb1bae3193e3693a1bee39:/Cycript.yy.in?ds=sidebyside diff --git a/Cycript.yy.in b/Cycript.yy.in index aa5f535..fe1873f 100644 --- a/Cycript.yy.in +++ b/Cycript.yy.in @@ -39,8 +39,11 @@ #include "E4X/Syntax.hpp" @end +#include "Highlight.hpp" + typedef struct { bool newline_; + hi::Value highlight_; union { bool bool_; @@ -78,6 +81,9 @@ typedef struct { CYString *string_; CYThis *this_; CYTrue *true_; + CYTypeModifier *type_; + CYTypedIdentifier *typedIdentifier_; + CYTypedParameter *typedParameter_; CYWord *word_; @begin ObjectiveC @@ -225,6 +231,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 @@ -448,6 +455,7 @@ int cylex(YYSTYPE *, cy::location *, void *); %type WithStatement %type Word %type WordOpt +%type Variable @begin ObjectiveC %type BoxableExpression @@ -464,12 +472,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_ @@ -477,7 +490,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 @@ -532,15 +550,15 @@ LexSetRegExp ; LexNoBrace - : { if (yychar == yyempty_) driver.nobrace_ = true; else if (yychar == token::OpenBrace || yychar == token::OpenBrace_) yychar = token::OpenBrace__; } + : { if (yychar == yyempty_) driver.no_.OpenBrace = true; else if (yychar == token::OpenBrace || yychar == token::OpenBrace_) yychar = token::OpenBrace__; } ; LexNoFunction - : { if (yychar == token::Function) yychar = token::Function_; } + : { if (yychar == yyempty_) driver.no_.Function = true; else if (yychar == token::Function) yychar = token::Function_; } ; LexNoAtImplementation - : { if (yychar == token::AtImplementation) yychar = token::AtImplementation_; } + : { if (yychar == yyempty_) driver.no_.AtImplementation = true; else if (yychar == token::AtImplementation) yychar = token::AtImplementation_; } ; LexSetStatement @@ -713,9 +731,13 @@ ParentheticalOpt | { $$ = NULL; } ; +Variable + : Identifier { $$ = CYNew CYVariable($1); } + ; + PrimaryExpression : "this" { $$ = $1; } - | Identifier { $$ = CYNew CYVariable($1); } + | Variable { $$ = $1; } | Literal { $$ = $1; } | ArrayLiteral { $$ = $1; } | ObjectLiteral { $$ = $1; } @@ -771,7 +793,7 @@ ObjectLiteral PropertyDefinitionList_ : "," PropertyDefinitionList { $$ = $2; } - | "," { $$ = NULL; } + | "," LexSetRegExp { $$ = NULL; } | { $$ = NULL; } ; @@ -781,7 +803,7 @@ PropertyDefinitionList PropertyDefinitionListOpt : PropertyDefinitionList { $$ = $1; } - | { $$ = NULL; } + | LexSetRegExp { $$ = NULL; } ; PropertyDefinition @@ -1054,7 +1076,7 @@ StatementList StatementListOpt : StatementList { $$ = $1; } - | LexSetRegExp { $$ = NULL; } + | LexSetStatement LexSetRegExp { $$ = NULL; } ; StatementListItem @@ -1191,7 +1213,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); } ; /* }}} */ @@ -1231,7 +1253,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); } ; /* }}} */ @@ -1304,7 +1326,7 @@ ArrowParameters ConciseBody : AssignmentExpression { $$ = CYNew CYReturn($1); } - | ";{" LexPushInOff FunctionBody LexPopIn "}" { $$ = $3; } + | LexSetRegExp ";{" LexPushInOff FunctionBody LexPopIn "}" { $$ = $4; } ; /* }}} */ /* 14 Program {{{ */ @@ -1318,11 +1340,52 @@ ProgramBody ProgramBodyOpt : ProgramBody { $$ = $1; } - | { $$ = NULL; } + | LexSetStatement LexSetRegExp { $$ = NULL; } ; /* }}} */ @begin ObjectiveC +/* Cycript (Objective-C): Type Encoding {{{ */ +SuffixedType + : IdentifierOpt { $$ = CYNew CYTypedIdentifier($1); } + | "(" LexPushInOff PrefixedType LexPopIn ")" { $$ = $3; } + | SuffixedType "[" NumericLiteral "]" { CYSetLast($1->type_) = CYNew CYTypeArrayOf($3->Value()); $$ = $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? */ @@ -1332,7 +1395,7 @@ ClassSuperOpt ClassFieldListOpt : Expression Identifier ";" ClassFieldListOpt { $$ = CYNew CYField($1, $2, $4); } - | { $$ = NULL; } + | LexSetRegExp { $$ = NULL; } ; ClassFields @@ -1345,8 +1408,7 @@ MessageScope ; TypeOpt - : "(" Expression ")" { $$ = $2; } - | "(" LexSetRegExp "void" ")" { $$ = CYNew CYString("v"); } + : "(" LexSetRegExp EncodedType ")" { $$ = $3; } | { $$ = NULL; } ; @@ -1491,7 +1553,7 @@ ImportPath ; StatementListItem - : "@import" ImportPath { $$ = CYNew CYImport(); } + : LexSetStatement LexSetRegExp "@import" ImportPath { $$ = CYNew CYImport(); } ; /* }}} */ /* Cycript (Objective-C): Boxed Expressions {{{ */ @@ -1509,6 +1571,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