From: Jay Freeman (saurik) Date: Sat, 28 Nov 2015 12:35:50 +0000 (-0800) Subject: Organize tokens into something more of a database. X-Git-Tag: v0.9.590~270 X-Git-Url: https://git.saurik.com/cycript.git/commitdiff_plain/aca28f9662f95e5a1835355830173624a300cd0c?ds=inline Organize tokens into something more of a database. --- diff --git a/Cycript.l.in b/Cycript.l.in index 935189c..0d0218f 100644 --- a/Cycript.l.in +++ b/Cycript.l.in @@ -245,20 +245,22 @@ XMLName {XMLNameStart}{XMLNamePart}* %% + /* RegEx {{{ */ \/{RegularExpressionBody}\/{RegularExpressionFlags} L C I(literal, RegEx(Y), tk::RegularExpressionLiteral, hi::Constant); \/{RegularExpressionBody}\/{RegularExpressionFlags}{UnicodeFail} L E("invalid flags") \/{RegularExpressionBody}?\\? L E("unterminated regex") - + /* }}} */ + /* Comment {{{ */ #![^\n]* L M - \/\/[^\n]* L M - /* http://ostermiller.org/findcomment.html */ - /* XXX: unify these two rules using !? */ + /* http://ostermiller.org/findcomment.html */ + /* XXX: unify these two rules using !? */ \/\*!([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ V() C I(comment, Comment(Y), tk::Comment, hi::Comment); \/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/ V(N) M \/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\** V() E("invalid comment") - + /* }}} */ + /* Element {{{ */ @begin E4X "<>" L F(tk::LeftRight, hi::Structure); "" L F(tk::LeftSlashRight, hi::Structure); @@ -280,7 +282,8 @@ XMLName {XMLNameStart}{XMLNamePart}* "<" L F(tk::Left, hi::Structure); "no_.AtImplementation ? tk::AtImplementation_ : tk::AtImplementation, hi::Meta); "@import" L C F(tk::AtImport, hi::Special); -"@selector" L C F(tk::AtSelector, hi::Meta); - -"@null" L C F(tk::AtNull, hi::Constant); -"@YES" L C F(tk::AtYes, hi::Constant); "@NO" L C F(tk::AtNo, hi::Constant); +"@null" L C F(tk::AtNull, hi::Constant); +"@selector" L C F(tk::AtSelector, hi::Meta); "@true" L C F(tk::AtTrue, hi::Constant); -"@false" L C F(tk::AtFalse, hi::Constant); +"@YES" L C F(tk::AtYes, hi::Constant); +@end -"NULL" L C I(identifier, Identifier("NULL"), tk::Identifier_, hi::Constant); -"nil" L C I(identifier, Identifier("nil"), tk::Identifier_, hi::Constant); -"YES" L C I(identifier, Identifier("YES"), tk::Yes, hi::Constant); -"NO" L C I(identifier, Identifier("NO"), tk::No, hi::Constant); +@({UnicodeStart}{UnicodeScrap}|{UnicodeFail}) L E("invalid keyword") + /* }}} */ + /* Highlight {{{ */ +"undefined" L C I(identifier, Identifier("undefined"), tk::Identifier_, hi::Operator); -"bool" L C I(identifier, Identifier("bool"), tk::Identifier_, hi::Type); -"BOOL" L C I(identifier, Identifier("BOOL"), tk::Identifier_, hi::Type); -"id" L C I(identifier, Identifier("id"), tk::Identifier_, hi::Type); -"SEL" L C I(identifier, Identifier("SEL"), tk::Identifier_, hi::Type); +@begin ObjectiveC +"bool" L C I(identifier, Identifier("bool"), tk::Identifier_, hi::Type); +"BOOL" L C I(identifier, Identifier("BOOL"), tk::Identifier_, hi::Type); +"id" L C I(identifier, Identifier("id"), tk::Identifier_, hi::Type); +"nil" L C I(identifier, Identifier("nil"), tk::Identifier_, hi::Constant); +"NULL" L C I(identifier, Identifier("NULL"), tk::Identifier_, hi::Constant); +"SEL" L C I(identifier, Identifier("SEL"), tk::Identifier_, hi::Type); @end + /* }}} */ + /* Reserved {{{ */ +"abstract" L C /*FII*/ I(identifier, Identifier("abstract"), tk::Abstract, hi::Meta); +"await" L C /*II?*/ I(identifier, Identifier("await"), tk::Await, hi::Meta); +"boolean" L C /*FII*/ I(identifier, Identifier("boolean"), tk::Boolean, hi::Type); +"break" L R /*KKK*/ F(tk::Break, hi::Control); +"byte" L C /*FII*/ I(identifier, Identifier("byte"), tk::Byte, hi::Type); +"case" L C /*KKK*/ F(tk::Case, hi::Control); +"catch" L C /*KKK*/ F(tk::Catch, hi::Control); +"char" L C /*FII*/ I(identifier, Identifier("char"), tk::Char, hi::Type); +"class" L C /*FFK*/ F(tk::Class, hi::Meta); +"const" L C /*FFK*/ F(tk::Const, hi::Meta); +"continue" L R /*KKK*/ F(tk::Continue, hi::Control); +"debugger" L C /*FKK*/ F(tk::Debugger, hi::Meta); +"default" L C /*KKK*/ F(tk::Default, hi::Control); +"delete" L C /*KKK*/ F(tk::Delete, hi::Operator); +"do" L C /*KKK*/ F(tk::Do, hi::Control); +"double" L C /*FII*/ I(identifier, Identifier("double"), tk::Double, hi::Type); +"else" L C /*KKK*/ F(tk::Else, hi::Control); +"enum" L C /*FFF*/ F(tk::Enum, hi::Meta); +"export" L C /*FFK*/ F(tk::Export, hi::Meta); +"extends" L C /*FFK*/ F(tk::Extends, hi::Meta); +"false" L C /*LLL*/ F(tk::False, hi::Constant); +"final" L C /*FII*/ I(identifier, Identifier("final"), tk::Final, hi::Meta); +"finally" L C /*KKK*/ F(tk::Finally, hi::Control); +"float" L C /*FII*/ I(identifier, Identifier("float"), tk::Float, hi::Type); +"for" L C /*KKK*/ F(tk::For, hi::Control); +"function" L C /*KKK*/ F(yyextra->no_.Function ? tk::Function_ : tk::Function, hi::Meta); +"goto" L C /*FII*/ I(identifier, Identifier("goto"), tk::Goto, hi::Control); +"if" L C /*KKK*/ F(tk::If, hi::Control); +"implements" L C /*FSS*/ I(identifier, Identifier("implements"), tk::Implements, hi::Meta); +"import" L C /*FFK*/ F(tk::Import, hi::Meta); +"in" L C /*KKK*/ F(yyextra->in_.top() ? tk::In_ : tk::In, hi::Operator); +"instanceof" L C /*KKK*/ F(tk::InstanceOf, hi::Operator); +"int" L C /*FII*/ I(identifier, Identifier("int"), tk::Int, hi::Type); +"interface" L C /*FSS*/ I(identifier, Identifier("interface"), tk::Interface, hi::Meta); +"let" L C /*IS?*/ I(identifier, Identifier("let"), tk::Let, hi::Meta); +"long" L C /*FII*/ I(identifier, Identifier("long"), tk::Long, hi::Type); +"native" L C /*FII*/ I(identifier, Identifier("native"), tk::Native, hi::Meta); +"new" L C /*KKK*/ F(tk::New, hi::Operator); +"null" L C /*LLL*/ F(tk::Null, hi::Constant); +"package" L C /*FSS*/ I(identifier, Identifier("package"), tk::Package, hi::Meta); +"private" L C /*FSS*/ I(identifier, Identifier("private"), tk::Private, hi::Meta); +"protected" L C /*FSS*/ I(identifier, Identifier("protected"), tk::Protected, hi::Meta); +"public" L C /*FSS*/ I(identifier, Identifier("public"), tk::Public, hi::Meta); +"return" L R /*KKK*/ F(tk::Return, hi::Control); +"short" L C /*FII*/ I(identifier, Identifier("short"), tk::Short, hi::Type); +"static" L C /*FS?*/ I(identifier, Identifier("static"), tk::Static, hi::Meta); +"super" L C /*FFK*/ F(tk::Super, hi::Constant); +"switch" L C /*KKK*/ F(tk::Switch, hi::Control); +"synchronized" L C /*FII*/ I(identifier, Identifier("synchronized"), tk::Synchronized, hi::Meta); +"this" L C /*KKK*/ F(tk::This, hi::Constant); +"throw" L R /*KKK*/ F(tk::Throw, hi::Control); +"throws" L C /*FII*/ I(identifier, Identifier("throws"), tk::Throws, hi::Meta); +"transient" L C /*FII*/ I(identifier, Identifier("transient"), tk::Transient, hi::Meta); +"true" L C /*LLL*/ F(tk::True, hi::Constant); +"try" L C /*KKK*/ F(tk::Try, hi::Control); +"typeof" L C /*KKK*/ F(tk::TypeOf, hi::Operator); +"var" L C /*KKK*/ F(tk::Var, hi::Meta); +"void" L C /*KKK*/ F(tk::Void, hi::Operator); +"volatile" L C /*FII*/ I(identifier, Identifier("volatile"), tk::Volatile, hi::Meta); +"while" L C /*KKK*/ F(tk::While, hi::Control); +"with" L C /*KKK*/ F(tk::With, hi::Control); +"yield" L R /*IS?*/ I(identifier, Identifier("yield"), tk::Yield, hi::Control); + +"auto" L C F(tk::Auto, hi::Meta); +"each" L C I(identifier, Identifier("each"), tk::Each, hi::Control); +"of" L C I(identifier, Identifier("of"), tk::Of, hi::Operator); -"undefined" L C I(identifier, Identifier("undefined"), tk::Identifier_, hi::Operator); - -"false" L C F(tk::False, hi::Constant); -"null" L C F(tk::Null, hi::Constant); -"true" L C F(tk::True, hi::Constant); - -"auto" L C F(tk::Auto, hi::Meta); -"break" L R F(tk::Break, hi::Control); -"case" L C F(tk::Case, hi::Control); -"catch" L C F(tk::Catch, hi::Control); -"continue" L R F(tk::Continue, hi::Control); -"default" L C F(tk::Default, hi::Control); -"delete" L C F(tk::Delete, hi::Operator); -"do" L C F(tk::Do, hi::Control); -"else" L C F(tk::Else, hi::Control); -"finally" L C F(tk::Finally, hi::Control); -"for" L C F(tk::For, hi::Control); -"function" L C F(yyextra->no_.Function ? tk::Function_ : tk::Function, hi::Meta); -"if" L C F(tk::If, hi::Control); -"in" L C F(yyextra->in_.top() ? tk::In_ : tk::In, hi::Operator); -"instanceof" L C F(tk::InstanceOf, hi::Operator); -"new" L C F(tk::New, hi::Operator); -"return" L R F(tk::Return, hi::Control); -"switch" L C F(tk::Switch, hi::Control); -"this" L C F(tk::This, hi::Constant); -"throw" L R F(tk::Throw, hi::Control); -"try" L C F(tk::Try, hi::Control); -"typeof" L C F(tk::TypeOf, hi::Operator); -"var" L C F(tk::Var, hi::Meta); -"void" L C F(tk::Void, hi::Operator); -"while" L C F(tk::While, hi::Control); -"with" L C F(tk::With, hi::Control); - -"debugger" L C F(tk::Debugger, hi::Meta); - -"const" L C F(tk::Const, hi::Meta); - -"class" L C F(tk::Class, hi::Meta); -"enum" L C F(tk::Enum, hi::Meta); -"export" L C F(tk::Export, hi::Meta); -"extends" L C F(tk::Extends, hi::Meta); -"import" L C F(tk::Import, hi::Meta); -"super" L C F(tk::Super, hi::Constant); - -"implements" L C I(identifier, Identifier("implements"), tk::Implements, hi::Meta); -"interface" L C I(identifier, Identifier("interface"), tk::Interface, hi::Meta); -"package" L C I(identifier, Identifier("package"), tk::Package, hi::Meta); -"private" L C I(identifier, Identifier("private"), tk::Private, hi::Meta); -"protected" L C I(identifier, Identifier("protected"), tk::Protected, hi::Meta); -"public" L C I(identifier, Identifier("public"), tk::Public, hi::Meta); -"static" L C I(identifier, Identifier("static"), tk::Static, hi::Meta); - -"abstract" L C I(identifier, Identifier("abstract"), tk::Abstract, hi::Meta); -"boolean" L C I(identifier, Identifier("boolean"), tk::Boolean, hi::Type); -"byte" L C I(identifier, Identifier("byte"), tk::Byte, hi::Type); -"char" L C I(identifier, Identifier("char"), tk::Char, hi::Type); -"double" L C I(identifier, Identifier("double"), tk::Double, hi::Type); -"final" L C I(identifier, Identifier("final"), tk::Final, hi::Meta); -"float" L C I(identifier, Identifier("float"), tk::Float, hi::Type); -"goto" L C I(identifier, Identifier("goto"), tk::Goto, hi::Control); -"int" L C I(identifier, Identifier("int"), tk::Int, hi::Type); -"long" L C I(identifier, Identifier("long"), tk::Long, hi::Type); -"native" L C I(identifier, Identifier("native"), tk::Native, hi::Meta); -"short" L C I(identifier, Identifier("short"), tk::Short, hi::Type); -"synchronized" L C I(identifier, Identifier("synchronized"), tk::Synchronized, hi::Meta); -"throws" L C I(identifier, Identifier("throws"), tk::Throws, hi::Meta); -"transient" L C I(identifier, Identifier("transient"), tk::Transient, hi::Meta); -"volatile" L C I(identifier, Identifier("volatile"), tk::Volatile, hi::Meta); - -"let" L C I(identifier, Identifier("let"), tk::Let, hi::Meta); -"yield" L R I(identifier, Identifier("yield"), tk::Yield, hi::Control); - -"each" L C I(identifier, Identifier("each"), tk::Each, hi::Control); -"of" L C I(identifier, Identifier("of"), tk::Of, hi::Operator); +@begin C +"extern" L C I(identifier, Identifier("extern"), tk::Extern, hi::Type); +"signed" L C I(identifier, Identifier("signed"), tk::Signed, hi::Type); +"typedef" L C I(identifier, Identifier("typedef"), tk::Typedef, hi::Meta); +"unsigned" L C I(identifier, Identifier("unsigned"), tk::Unsigned, hi::Type); +@end -@begin E4X -"namespace" L C I(identifier, Identifier("namespace"), tk::Namespace, hi::Meta); -"xml" L C I(identifier, Identifier("xml"), tk::XML, hi::Meta); +@begin ObjectiveC +"NO" L C I(identifier, Identifier("NO"), tk::No, hi::Constant); +"YES" L C I(identifier, Identifier("YES"), tk::Yes, hi::Constant); @end +@begin E4X +"namespace" L C I(identifier, Identifier("namespace"), tk::Namespace, hi::Meta); +"xml" L C I(identifier, Identifier("xml"), tk::XML, hi::Meta); +@end + /* }}} */ + /* Identifier {{{ */ {UnicodeStart}{UnicodePart}* L C I(identifier, Identifier(Y), tk::Identifier_, hi::Identifier); {IdentifierStart}{IdentifierPart}* L C { @@ -489,7 +495,8 @@ XMLName {XMLNameStart}{XMLNamePart}* } ({IdentifierStart}{IdentifierPart}*)?{IdentifierFail} L E("invalid identifier") - + /* }}} */ + /* Number {{{ */ 0[0-7]+ L C I(number, Number(strtoull(yytext + 1, NULL, 8)), tk::NumericLiteral, hi::Constant); 0[0-9]+ L C I(number, Number(strtoull(yytext + 1, NULL, 10)), tk::NumericLiteral, hi::Constant); @@ -500,7 +507,8 @@ XMLName {XMLNameStart}{XMLNamePart}* (\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)([eE][+-]?[0-9]+)? L C I(number, Number(strtod(yytext, NULL)), tk::NumericLiteral, hi::Constant); (\.[0-9]+|(0|[1-9][0-9]*)(\.[0-9]*)?)[eE][+-]?{IdentifierScrap} L E("invalid exponent") (\.?[0-9]|(0|[1-9][0-9]*)\.){IdentifierScrap} L E("invalid number") - + /* }}} */ + /* String {{{ */ '{SingleString}'|\"{DoubleString}\" L C { char *value(A char[yyleng]); char *local(value); @@ -561,15 +569,13 @@ XMLName {XMLNameStart}{XMLNamePart}* {StringPrefix}\\(x.{0,2}|u([^{].{0,3}|\{[^}]*)?|{UnicodeFail})? L E("invalid escape") {StringPrefix} L E("invalid string") + /* }}} */ {LineTerminatorSequence} yylloc->step(); yylloc->end.lines(); N - {WhiteSpace} L <> if (yyextra->auto_) { yyextra->auto_ = false; F(tk::AutoComplete, hi::Nothing); } L yyterminate(); -@({UnicodeStart}{UnicodeScrap}|{UnicodeFail}) L E("invalid keyword") - . L E("invalid character") %% diff --git a/Cycript.yy.in b/Cycript.yy.in index b38c7fc..8b00100 100644 --- a/Cycript.yy.in +++ b/Cycript.yy.in @@ -264,26 +264,32 @@ int cylex(YYSTYPE *, CYLocation *, void *); %token Null "null" %token True "true" -// ES3/ES5/WIE/JSC Reserved -%token Auto "auto" %token Break "break" %token Case "case" %token Catch "catch" +%token Class "class" +%token Const "const" %token Continue "continue" +%token Debugger "debugger" %token Default "default" %token Delete "delete" %token Do "do" %token Else "else" +%token Enum "enum" +%token Export "export" +%token Extends "extends" %token Finally "finally" %token For "for" %token Function "function" %token Function_ ";function" %token If "if" +%token Import "import" %token In "in" %token In_ "!in" %token InstanceOf "instanceof" %token New "new" %token Return "return" +%token Super "super" %token Switch "switch" %token This "this" %token Throw "throw" @@ -294,31 +300,8 @@ int cylex(YYSTYPE *, CYLocation *, void *); %token While "while" %token With "with" -// ES3/IE6 Future, ES5/JSC Reserved -%token Debugger "debugger" - -// ES3/ES5/IE6 Future, JSC Reserved -%token Const "const" - -// ES3/ES5/IE6/JSC Future -%token Class "class" -%token Enum "enum" -%token Export "export" -%token Extends "extends" -%token Import "import" -%token Super "super" - -// ES3 Future, ES5 Strict Future -%token Implements "implements" -%token Interface "interface" -%token Package "package" -%token Private "private" -%token Protected "protected" -%token Public "public" -%token Static "static" - -// ES3 Future %token Abstract "abstract" +%token Await "await" %token Boolean "boolean" %token Byte "byte" %token Char "char" @@ -326,25 +309,29 @@ int cylex(YYSTYPE *, CYLocation *, void *); %token Final "final" %token Float "float" %token Goto "goto" +%token Implements "implements" %token Int "int" +%token Interface "interface" +%token Let "let" %token Long "long" %token Native "native" +%token Package "package" +%token Private "private" +%token Protected "protected" +%token Public "public" %token Short "short" +%token Static "static" %token Synchronized "synchronized" %token Throws "throws" %token Transient "transient" %token Volatile "volatile" - -// ES5 Strict -%token Let "let" %token Yield "yield" -// Woah?! +%token Auto "auto" %token Each "each" %token Of "of" @begin E4X -// E4X Conditional %token Namespace "namespace" %token XML "xml" @end @@ -621,6 +608,7 @@ NewLineOpt Word : Identifier { $$ = $1; } + | "auto" { $$ = CYNew CYWord("auto"); } | "break" NewLineOpt { $$ = CYNew CYWord("break"); } | "case" { $$ = CYNew CYWord("case"); } @@ -675,22 +663,22 @@ WordOpt IdentifierType : Identifier_ { $$ = $1; } - | "implements" { $$ = $1; } - | "interface" { $$ = $1; } - | "package" { $$ = $1; } - | "private" { $$ = $1; } - | "protected" { $$ = $1; } - | "public" { $$ = $1; } - | "static" { $$ = $1; } - | "abstract" { $$ = $1; } + | "await" { $$ = $1; } | "boolean" { $$ = $1; } | "byte" { $$ = $1; } | "double" { $$ = $1; } | "final" { $$ = $1; } | "float" { $$ = $1; } | "goto" { $$ = $1; } + | "implements" { $$ = $1; } + | "interface" { $$ = $1; } | "native" { $$ = $1; } + | "package" { $$ = $1; } + | "private" { $$ = $1; } + | "protected" { $$ = $1; } + | "public" { $$ = $1; } + | "static" { $$ = $1; } | "synchronized" { $$ = $1; } | "throws" { $$ = $1; } | "transient" { $$ = $1; } @@ -712,14 +700,14 @@ Identifier | "short" { $$ = $1; } | "volatile" { $$ = $1; } @begin C + | "extern" { $$ = $1; } + | "signed" { $$ = $1; } | "typedef" { $$ = $1; } | "unsigned" { $$ = $1; } - | "signed" { $$ = $1; } - | "extern" { $$ = $1; } @end @begin ObjectiveC - | "YES" { $$ = $1; } | "NO" { $$ = $1; } + | "YES" { $$ = $1; } @end ;