X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/3cc3e14d8539cef545aa57f3b1a3499c0d3fdf1b..59ffbc36a6b9383533e87321fc7769e8f3fd5a8a:/Parser.ypp.in?ds=sidebyside diff --git a/Parser.ypp.in b/Parser.ypp.in index 547d93e..c076967 100644 --- a/Parser.ypp.in +++ b/Parser.ypp.in @@ -305,6 +305,7 @@ type; }) %token Plus "+" %token PlusEqual "+=" %token PlusPlus "++" +%token QuestionPeriod "?." %token Right ">" %token RightEqual ">=" %token RightRight ">>" @@ -2045,7 +2046,7 @@ ParameterTail ; SuffixedType - : SuffixedTypeOpt[typed] "[" NumericLiteral[size] "]" { $$ = $typed; $$->modifier_ = CYNew CYTypeArrayOf($size, $$->modifier_); } + : SuffixedTypeOpt[typed] "[" AssignmentExpression[size] "]" { $$ = $typed; $$->modifier_ = CYNew CYTypeArrayOf($size, $$->modifier_); } | "(" "^" TypeQualifierRightOpt[typed] ")" "(" TypedParameters[parameters] ")" { $$ = $typed; $$->modifier_ = CYNew CYTypeBlockWith($parameters, $$->modifier_); } | TypeSignifier[typed] "(" ParameterTail[modifier] { $$ = $typed; CYSetLast($modifier) = $$->modifier_; $$->modifier_ = $modifier; } | "("[parenthesis] ParameterTail[modifier] { $$ = CYNew CYTypedName(@parenthesis); CYSetLast($modifier) = $$->modifier_; $$->modifier_ = $modifier; } @@ -2129,6 +2130,7 @@ PrimitiveType | "float" { $$ = CYNew CYTypeFloating(0); } | "double" { $$ = CYNew CYTypeFloating(1); } | "long" "double" { $$ = CYNew CYTypeFloating(2); } + | "void" { $$ = CYNew CYTypeVoid(); } ; PrimitiveReference @@ -2140,9 +2142,7 @@ PrimitiveReference ; TypedIdentifierMaybe - : TypeQualifierLeft[modifier] "void" TypeQualifierRight[typed] { $$ = $typed; $$->specifier_ = CYNew CYTypeVoid(); CYSetLast($modifier) = $$->modifier_; $$->modifier_ = $modifier; } - | "void" TypeQualifierRight[typed] { $$ = $typed; $$->specifier_ = CYNew CYTypeVoid(); } - | TypeQualifierLeftOpt[modifier] PrimitiveReference[specifier] TypeQualifierRightOpt[typed] { $$ = $typed; $$->specifier_ = $specifier; CYSetLast($modifier) = $$->modifier_; $$->modifier_ = $modifier; } + : TypeQualifierLeftOpt[modifier] PrimitiveReference[specifier] TypeQualifierRightOpt[typed] { $$ = $typed; $$->specifier_ = $specifier; CYSetLast($modifier) = $$->modifier_; $$->modifier_ = $modifier; } ; TypedIdentifierYes @@ -2166,13 +2166,11 @@ TypedIdentifierField TypedIdentifierEncoding : TypedIdentifierNo[pass] { $$ = $pass; } | TypedIdentifierTagged[typed] { if ($typed->name_ != NULL) CYERR($typed->location_, "unexpected identifier"); $$ = $typed; } - | "void" TypeSignifierNone[typed] { $$ = $typed; $$->specifier_ = CYNew CYTypeVoid(); } ; TypedIdentifierDefinition : TypedIdentifierYes[pass] { $$ = $pass; } | TypeQualifierLeftOpt[modifier] "struct" IdentifierTypeOpt[name] "{" StructFieldListOpt[fields] "}" TypeQualifierRightOpt[typed] { if ($typed->name_ == NULL) CYERR($typed->location_, "expected identifier"); $$ = $typed; $$->specifier_ = CYNew CYTypeStruct($name, CYNew CYStructTail($fields)); CYSetLast($modifier) = $$->modifier_; $$->modifier_ = $modifier; } - | "void" TypeSignifier[typed] { $$ = $typed; $$->specifier_ = CYNew CYTypeVoid(); } ; PrimaryExpression @@ -2407,7 +2405,6 @@ TypedParameterList TypedParameterListOpt : TypedParameterList[pass] { $$ = $pass; } - | "void" { $$ = CYNew CYTypedFormal(false); } | { $$ = CYNew CYTypedFormal(false); } ; @@ -2711,6 +2708,12 @@ MemberAccess : "." "[" AssignmentExpression[property] "]" { $$ = CYNew CYSubscriptMember(NULL, $property); } ; /* }}} */ +/* JavaScript FTW: Undefined Monad {{{ */ +MemberAccess + : "?." IdentifierName[property] { $$ = CYNew CYAttemptMember(NULL, CYNew CYString($property)); } + | "?." AutoComplete { driver.mode_ = CYDriver::AutoDirect; YYACCEPT; } + ; +/* }}} */ /* JavaScript FTW: Java "Anonymous Inner Classes" {{{ */ BracedParameter