X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/1e8d80477a3e058a30c477955f1e0c56deb6e956..2c4a8bb6222b88ff96fbf25372179646ce15f706:/Parser.ypp.in?ds=sidebyside diff --git a/Parser.ypp.in b/Parser.ypp.in index d608263..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 ">>" @@ -443,8 +444,6 @@ type; }) %token ___proto___ "__proto__" %token _prototype_ "prototype" %token _public_ "public" -%token ___restrict_ "__restrict" -%token _restrict_ "restrict" %token _set_ "set" %token _short_ "short" %token _static_ "static" @@ -1032,8 +1031,6 @@ IdentifierNoOf | "int" { $$ = CYNew CYIdentifier("int"); } | "__int128" { $$ = CYNew CYIdentifier("__int128"); } | "long" { $$ = CYNew CYIdentifier("long"); } - | "__restrict" { $$ = CYNew CYIdentifier("__restrict"); } - | "restrict" { $$ = CYNew CYIdentifier("restrict"); } | "short" { $$ = CYNew CYIdentifier("short"); } | "static" { $$ = CYNew CYIdentifier("static"); } | "volatile" { $$ = CYNew CYIdentifier("volatile"); } @@ -2044,31 +2041,12 @@ TypeSignifierOpt | TypeSignifierNone[pass] { $$ = $pass; } ; -Restrict - : "__restrict" - | "restrict" - ; - -RestrictOpt - : Restrict - | - ; - -ParameterModifier - : "throw" "(" ")" - ; - -ParameterModifierOpt - : ParameterModifier - | - ; - ParameterTail - : TypedParameterListOpt[formal] ")" ParameterModifierOpt { $$ = CYNew CYTypeFunctionWith($formal->variadic_, $formal->parameters_); } + : TypedParameterListOpt[formal] ")" { $$ = CYNew CYTypeFunctionWith($formal->variadic_, $formal->parameters_); } ; SuffixedType - : SuffixedTypeOpt[typed] "[" RestrictOpt 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; } @@ -2098,7 +2076,6 @@ TypeQualifierRight | PrefixedType[pass] { $$ = $pass; } | "const" TypeQualifierRightOpt[typed] { $$ = $typed; $$->modifier_ = CYNew CYTypeConstant($$->modifier_); } | "volatile" TypeQualifierRightOpt[typed] { $$ = $typed; $$->modifier_ = CYNew CYTypeVolatile($$->modifier_); } - | Restrict TypeQualifierRightOpt[typed] { $$ = $typed; } ; TypeQualifierRightOpt @@ -2153,6 +2130,7 @@ PrimitiveType | "float" { $$ = CYNew CYTypeFloating(0); } | "double" { $$ = CYNew CYTypeFloating(1); } | "long" "double" { $$ = CYNew CYTypeFloating(2); } + | "void" { $$ = CYNew CYTypeVoid(); } ; PrimitiveReference @@ -2164,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 @@ -2190,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 @@ -2431,7 +2405,6 @@ TypedParameterList TypedParameterListOpt : TypedParameterList[pass] { $$ = $pass; } - | "void" { $$ = CYNew CYTypedFormal(false); } | { $$ = CYNew CYTypedFormal(false); } ; @@ -2735,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