diff --git a/CHANGELOG.md b/CHANGELOG.md index 50dadcbf9..8998a8c49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ All notable changes to this project will be documented in this file. - "Show detail" context menu item for items in folder preview - [#1682] AS2 - Adding class by context menu on packages - Simple editor - detection of english color name (based on CSS names) +- AS1/2 - highlight variable definition and all its instances on cursor place + (also in edit mode) ### Changed - AS1/2 - Single DoAction tag inside frame is now displayed directly as frame node @@ -39,6 +41,7 @@ All notable changes to this project will be documented in this file. - AS1/2 improper selection of search result - [#2459] AS1/2 StoreRegister improper declaration position - AS2 Class names not showing in Folder list view +- AS1/2 - Incorrect DefineFunction2 parameter names when parameter name is empty ## [23.0.1] - 2025-05-16 ### Fixed diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index 67b2a6ce1..133a8b69c 100644 Binary files a/lib/jsyntaxpane-0.9.5.jar and b/lib/jsyntaxpane-0.9.5.jar differ diff --git a/libsrc/ffdec_lib/lexers/actionscript_script.flex b/libsrc/ffdec_lib/lexers/actionscript_script.flex index 5a9aac868..2578469c0 100644 --- a/libsrc/ffdec_lib/lexers/actionscript_script.flex +++ b/libsrc/ffdec_lib/lexers/actionscript_script.flex @@ -38,6 +38,8 @@ import java.util.Stack; private int repeatNum = 1; + private int itemStart = -1; + private boolean caseSensitiveIdentifiers = false; public static final int SWF_VERSION_CASE_SENSITIVE = 7; @@ -152,258 +154,260 @@ Preprocessor = \u00A7\u00A7 {Identifier} { /* keywords */ - "break" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); } - "case" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); } - "continue" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); } - "default" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); } - "do" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DO, yytext()); } - "while" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); } - "else" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); } - "for" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); } - "each" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EACH, yytext()); } - "in" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IN, yytext()); } - "if" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IF, yytext()); } - "return" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); } - "super" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); } - "switch" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); } - "throw" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); } - "try" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); } - "catch" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); } - "finally" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); } - "while" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); } - "with" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); } - "dynamic" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DYNAMIC, yytext()); } - "private" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); } - "public" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); } - "static" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.STATIC, yytext()); } - "class" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); } - "extends" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); } - "function" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); } - "get" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.GET, yytext()); } - "implements" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); } - "interface" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); } - "set" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SET, yytext()); } - "var" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); } - "import" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); } - "false" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); } - "null" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); } - "this" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); } - "true" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); } + "break" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); } + "case" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); } + "continue" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); } + "default" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); } + "do" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.DO, yytext()); } + "while" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); } + "else" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); } + "for" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); } + "each" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.EACH, yytext()); } + "in" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IN, yytext()); } + "if" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IF, yytext()); } + "return" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); } + "super" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); } + "switch" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); } + "throw" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); } + "try" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); } + "catch" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); } + "finally" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); } + "while" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); } + "with" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); } + "dynamic" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.DYNAMIC, yytext()); } + "private" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); } + "public" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); } + "static" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.STATIC, yytext()); } + "class" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); } + "extends" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); } + "function" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); } + "get" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.GET, yytext()); } + "implements" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); } + "interface" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); } + "set" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.SET, yytext()); } + "var" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); } + "import" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); } + "false" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); } + "null" { return new ParsedSymbol(yychar(), SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); } + "this" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); } + "true" { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); } /* getURL */ - [gG][eE][tT][uU][rR][lL] { if (caseSensitiveIdentifiers && !"getURL".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); } + [gG][eE][tT][uU][rR][lL] { if (caseSensitiveIdentifiers && !"getURL".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); } /* trace */ - [tT][rR][aA][cC][eE] { if (caseSensitiveIdentifiers && !"trace".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); } + [tT][rR][aA][cC][eE] { if (caseSensitiveIdentifiers && !"trace".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); } /* gotoAndStop */ - [gG][oO][tT][oO][aA][nN][dD][sS][tT][oO][pP] { if (caseSensitiveIdentifiers && !"gotoAndStop".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); } + [gG][oO][tT][oO][aA][nN][dD][sS][tT][oO][pP] { if (caseSensitiveIdentifiers && !"gotoAndStop".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); } /* nextFrame */ - [nN][eE][xX][tT][fF][rR][aA][mM][eE] { if (caseSensitiveIdentifiers && !"nextFrame".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); } + [nN][eE][xX][tT][fF][rR][aA][mM][eE] { if (caseSensitiveIdentifiers && !"nextFrame".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); } /* play */ - [pP][lL][aA][yY] { if (caseSensitiveIdentifiers && !"play".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); } + [pP][lL][aA][yY] { if (caseSensitiveIdentifiers && !"play".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); } /* prevFrame */ - [pP][rR][eE][vV][fF][rR][aA][mM][eE] { if (caseSensitiveIdentifiers && !"prevFrame".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); } + [pP][rR][eE][vV][fF][rR][aA][mM][eE] { if (caseSensitiveIdentifiers && !"prevFrame".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); } /* tellTarget */ - [tT][eE][lL][lL][tT][aA][rR][gG][eE][tT] { if (caseSensitiveIdentifiers && !"tellTarget".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); } + [tT][eE][lL][lL][tT][aA][rR][gG][eE][tT] { if (caseSensitiveIdentifiers && !"tellTarget".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); } /* stop */ - [sS][tT][oO][pP] { if (caseSensitiveIdentifiers && !"stop".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); } + [sS][tT][oO][pP] { if (caseSensitiveIdentifiers && !"stop".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); } /* stopAllSounds */ - [sS][tT][oO][pP][aA][lL][lL][sS][oO][uU][nN][dD][sS] { if (caseSensitiveIdentifiers && !"stopAllSounds".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); } + [sS][tT][oO][pP][aA][lL][lL][sS][oO][uU][nN][dD][sS] { if (caseSensitiveIdentifiers && !"stopAllSounds".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); } /* toggleHighQuality */ - [tT][oO][gG][gG][lL][eE][hH][iI][gG][hH][qQ][uU][aA][lL][iI][tT][yY] { if (caseSensitiveIdentifiers && !"toggleHighQuality".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); } + [tT][oO][gG][gG][lL][eE][hH][iI][gG][hH][qQ][uU][aA][lL][iI][tT][yY] { if (caseSensitiveIdentifiers && !"toggleHighQuality".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); } /* ifFrameLoaded */ - [iI][fF][fF][rR][aA][mM][eE][lL][oO][aA][dD][eE][dD] { if (caseSensitiveIdentifiers && !"ifFrameLoaded".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); } + [iI][fF][fF][rR][aA][mM][eE][lL][oO][aA][dD][eE][dD] { if (caseSensitiveIdentifiers && !"ifFrameLoaded".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); } /* ord */ - [oO][rR][dD] { if (caseSensitiveIdentifiers && !"ord".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); } + [oO][rR][dD] { if (caseSensitiveIdentifiers && !"ord".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); } /* chr */ - [cC][hH][rR] { if (caseSensitiveIdentifiers && !"chr".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); } + [cC][hH][rR] { if (caseSensitiveIdentifiers && !"chr".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); } /* duplicateMovieClip */ - [dD][uU][pP][lL][iI][cC][aA][tT][eE][mM][oO][vV][iI][eE][cC][lL][iI][pP] { if (caseSensitiveIdentifiers && !"duplicateMovieClip".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); } + [dD][uU][pP][lL][iI][cC][aA][tT][eE][mM][oO][vV][iI][eE][cC][lL][iI][pP] { if (caseSensitiveIdentifiers && !"duplicateMovieClip".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); } /* stopDrag */ - [sS][tT][oO][pP][dD][rR][aA][gG] { if (caseSensitiveIdentifiers && !"stopDrag".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); } + [sS][tT][oO][pP][dD][rR][aA][gG] { if (caseSensitiveIdentifiers && !"stopDrag".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); } /* getTimer */ - [gG][eE][tT][tT][iI][mM][eE][rR] { if (caseSensitiveIdentifiers && !"getTimer".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); } + [gG][eE][tT][tT][iI][mM][eE][rR] { if (caseSensitiveIdentifiers && !"getTimer".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); } /* loadVariables */ - [lL][oO][aA][dD][vV][aA][rR][iI][aA][bB][lL][eE][sS] { if (caseSensitiveIdentifiers && !"loadVariables".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); } + [lL][oO][aA][dD][vV][aA][rR][iI][aA][bB][lL][eE][sS] { if (caseSensitiveIdentifiers && !"loadVariables".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); } /* loadMovie */ - [lL][oO][aA][dD][mM][oO][vV][iI][eE] { if (caseSensitiveIdentifiers && !"loadMovie".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); } + [lL][oO][aA][dD][mM][oO][vV][iI][eE] { if (caseSensitiveIdentifiers && !"loadMovie".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); } /* gotoAndPlay */ - [gG][oO][tT][oO][aA][nN][dD][pP][lL][aA][yY] { if (caseSensitiveIdentifiers && !"gotoAndPlay".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); } + [gG][oO][tT][oO][aA][nN][dD][pP][lL][aA][yY] { if (caseSensitiveIdentifiers && !"gotoAndPlay".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); } /* mbord */ - [mM][bB][oO][rR][dD] { if (caseSensitiveIdentifiers && !"mbord".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); } + [mM][bB][oO][rR][dD] { if (caseSensitiveIdentifiers && !"mbord".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); } /* mbchr */ - [mM][bB][cC][hH][rR] { if (caseSensitiveIdentifiers && !"mbchr".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); } + [mM][bB][cC][hH][rR] { if (caseSensitiveIdentifiers && !"mbchr".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); } /* mblength */ - [mM][bB][lL][eE][nN][gG][tT][hH] { if (caseSensitiveIdentifiers && !"mblength".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); } + [mM][bB][lL][eE][nN][gG][tT][hH] { if (caseSensitiveIdentifiers && !"mblength".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); } /* mbsubstring */ - [mM][bB][sS][uU][bB][sS][tT][rR][iI][nN][gG] { if (caseSensitiveIdentifiers && !"mbsubstring".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); } + [mM][bB][sS][uU][bB][sS][tT][rR][iI][nN][gG] { if (caseSensitiveIdentifiers && !"mbsubstring".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); } /* random */ - [rR][aA][nN][dD][oO][mM] { if (caseSensitiveIdentifiers && !"random".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); } + [rR][aA][nN][dD][oO][mM] { if (caseSensitiveIdentifiers && !"random".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); } /* removeMovieClip */ - [rR][eE][mM][oO][vV][eE][mM][oO][vV][iI][eE][cC][lL][iI][pP] { if (caseSensitiveIdentifiers && !"removeMovieClip".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); } + [rR][eE][mM][oO][vV][eE][mM][oO][vV][iI][eE][cC][lL][iI][pP] { if (caseSensitiveIdentifiers && !"removeMovieClip".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); } /* startDrag */ - [sS][tT][aA][rR][tT][dD][rR][aA][gG] { if (caseSensitiveIdentifiers && !"startDrag".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); } + [sS][tT][aA][rR][tT][dD][rR][aA][gG] { if (caseSensitiveIdentifiers && !"startDrag".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); } /* substr */ - [sS][uU][bB][sS][tT][rR] { if (caseSensitiveIdentifiers && !"substr".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); } + [sS][uU][bB][sS][tT][rR] { if (caseSensitiveIdentifiers && !"substr".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); } /* length */ - [lL][eE][nN][gG][tT][hH] { if (caseSensitiveIdentifiers && !"length".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); } + [lL][eE][nN][gG][tT][hH] { if (caseSensitiveIdentifiers && !"length".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); } /* int */ - [iI][nN][tT] { if (caseSensitiveIdentifiers && !"int".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); } + [iI][nN][tT] { if (caseSensitiveIdentifiers && !"int".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); } /* targetPath */ - [tT][aA][rR][gG][eE][tT][pP][aA][tT][hH] { if (caseSensitiveIdentifiers && !"targetPath".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); } + [tT][aA][rR][gG][eE][tT][pP][aA][tT][hH] { if (caseSensitiveIdentifiers && !"targetPath".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); } /* Number */ - [nN][uU][mM][bB][eE][rR] { if (caseSensitiveIdentifiers && !"Number".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); } + [nN][uU][mM][bB][eE][rR] { if (caseSensitiveIdentifiers && !"Number".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); } /* String */ - [sS][tT][rR][iI][nN][gG] { if (caseSensitiveIdentifiers && !"String".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); } + [sS][tT][rR][iI][nN][gG] { if (caseSensitiveIdentifiers && !"String".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); } /* eval */ - [eE][vV][aA][lL] { if (caseSensitiveIdentifiers && !"eval".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); } + [eE][vV][aA][lL] { if (caseSensitiveIdentifiers && !"eval".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); } /* undefined */ - [uU][nN][dD][eE][fF][iI][nN][eE][dD] { if (caseSensitiveIdentifiers && !"undefined".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); } + [uU][nN][dD][eE][fF][iI][nN][eE][dD] { if (caseSensitiveIdentifiers && !"undefined".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); } /* newline */ - [nN][eE][wW][lL][iI][nN][eE] { if (caseSensitiveIdentifiers && !"newline".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); } + [nN][eE][wW][lL][iI][nN][eE] { if (caseSensitiveIdentifiers && !"newline".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); } /* getVersion */ - [gG][eE][tT][vV][eE][rR][sS][iI][oO][nN] { if (caseSensitiveIdentifiers && !"getVersion".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); } + [gG][eE][tT][vV][eE][rR][sS][iI][oO][nN] { if (caseSensitiveIdentifiers && !"getVersion".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); } /* call */ - [cC][aA][lL][lL] { if (caseSensitiveIdentifiers && !"call".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); } + [cC][aA][lL][lL] { if (caseSensitiveIdentifiers && !"call".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); } /* loadMovieNum */ - [lL][oO][aA][dD][mM][oO][vV][iI][eE][nN][uU][mM] { if (caseSensitiveIdentifiers && !"loadMovieNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); } + [lL][oO][aA][dD][mM][oO][vV][iI][eE][nN][uU][mM] { if (caseSensitiveIdentifiers && !"loadMovieNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); } /* loadVariablesNum */ - [lL][oO][aA][dD][vV][aA][rR][iI][aA][bB][lL][eE][sS][nN][uU][mM] { if (caseSensitiveIdentifiers && !"loadVariablesNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); } + [lL][oO][aA][dD][vV][aA][rR][iI][aA][bB][lL][eE][sS][nN][uU][mM] { if (caseSensitiveIdentifiers && !"loadVariablesNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); } /* printAsBitmapNum */ - [pP][rR][iI][nN][tT][aA][sS][bB][iI][tT][mM][aA][pP][nN][uU][mM] { if (caseSensitiveIdentifiers && !"printAsBitmapNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); } + [pP][rR][iI][nN][tT][aA][sS][bB][iI][tT][mM][aA][pP][nN][uU][mM] { if (caseSensitiveIdentifiers && !"printAsBitmapNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); } /* printNum */ - [pP][rR][iI][nN][tT][nN][uU][mM] { if (caseSensitiveIdentifiers && !"printNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); } + [pP][rR][iI][nN][tT][nN][uU][mM] { if (caseSensitiveIdentifiers && !"printNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); } /* printAsBitmap */ - [pP][rR][iI][nN][tT][aA][sS][bB][iI][tT][mM][aA][pP] { if (caseSensitiveIdentifiers && !"printAsBitmap".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); } + [pP][rR][iI][nN][tT][aA][sS][bB][iI][tT][mM][aA][pP] { if (caseSensitiveIdentifiers && !"printAsBitmap".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); } /* print */ - [pP][rR][iI][nN][tT] { if (caseSensitiveIdentifiers && !"print".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); } + [pP][rR][iI][nN][tT] { if (caseSensitiveIdentifiers && !"print".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); } /* unloadMovie */ - [uU][nN][lL][oO][aA][dD][mM][oO][vV][iI][eE] { if (caseSensitiveIdentifiers && !"unloadMovie".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); } + [uU][nN][lL][oO][aA][dD][mM][oO][vV][iI][eE] { if (caseSensitiveIdentifiers && !"unloadMovie".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); } /* unloadMovieNum */ - [uU][nN][lL][oO][aA][dD][mM][oO][vV][iI][eE][nN][uU][mM] { if (caseSensitiveIdentifiers && !"unloadMovieNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); } + [uU][nN][lL][oO][aA][dD][mM][oO][vV][iI][eE][nN][uU][mM] { if (caseSensitiveIdentifiers && !"unloadMovieNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); } /* fscommand2 */ - [fF][sS][cC][oO][mM][mM][aA][nN][dD] 2 { if (caseSensitiveIdentifiers && !"fscommand2".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND2, yytext()); } + [fF][sS][cC][oO][mM][mM][aA][nN][dD] 2 { if (caseSensitiveIdentifiers && !"fscommand2".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND2, yytext()); } /* fscommand */ - [fF][sS][cC][oO][mM][mM][aA][nN][dD] { if (caseSensitiveIdentifiers && !"fscommand".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); } + [fF][sS][cC][oO][mM][mM][aA][nN][dD] { if (caseSensitiveIdentifiers && !"fscommand".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); } /* operators */ - "(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } - ")" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } - "{" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } - "}" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } - "[" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } - "]" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } - ";" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } - "," { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } - "..." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } - "." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } - "=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } - ">" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } - "<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } - "!" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } - "~" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } - "?" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } - ":" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } - "===" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } - "==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } - "<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } - ">=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } - "!==" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } - "!=" | "<>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } - "&&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } - "||" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } - "++" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } - "--" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } - "+" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } - "-" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } - "*" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } - "/" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } - "&" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } - "|" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } - "^" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } - "%" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } - "<<" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } - ">>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } - ">>>" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } - "+=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } - "-=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } - "*=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } - "/=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } - "&=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } - "|=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } - "^=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } - "%=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } - "<<=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } - ">>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } - ">>>=" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } - "delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } - "instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } - "new" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } - "typeof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } - "void" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } - "@" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } - "and" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); } - "or" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); } + "(" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } + ")" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } + "{" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } + "}" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } + "[" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } + "]" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } + ";" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } + "," { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } + "..." { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } + "." { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } + "=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } + ">" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } + "<" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } + "!" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } + "~" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } + "?" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } + ":" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } + "===" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } + "==" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } + "<=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } + ">=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } + "!==" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } + "!=" | "<>" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } + "&&" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } + "||" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } + "++" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } + "--" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } + "+" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } + "-" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } + "*" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } + "/" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } + "&" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } + "|" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } + "^" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } + "%" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } + "<<" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } + ">>" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } + ">>>" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } + "+=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } + "-=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } + "*=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } + "/=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } + "&=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } + "|=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } + "^=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } + "%=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } + "<<=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } + ">>=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } + ">>>=" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } + "delete" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } + "instanceof" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } + "new" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } + "typeof" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } + "void" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } + "@" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } + "and" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); } + "or" { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); } - "#" {Identifier} { return new ParsedSymbol(SymbolGroup.DIRECTIVE, SymbolType.DIRECTIVE, yytext().substring(1)); } + "#" {Identifier} { return new ParsedSymbol(yychar(), SymbolGroup.DIRECTIVE, SymbolType.DIRECTIVE, yytext().substring(1)); } /* string literal */ \" { + itemStart = yychar(); string.setLength(0); yybegin(STRING); } {Preprocessor} { - return new ParsedSymbol(SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); + return new ParsedSymbol(yychar(), SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); } "\u00A7" { + itemStart = yychar(); string.setLength(0); yybegin(OIDENTIFIER); } @@ -411,6 +415,7 @@ Preprocessor = \u00A7\u00A7 {Identifier} /* character literal */ \' { + itemStart = yychar(); string.setLength(0); yybegin(CHARLITERAL); } @@ -419,18 +424,18 @@ Preprocessor = \u00A7\u00A7 {Identifier} {DecIntegerLiteral} { try{ - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext())); + return new ParsedSymbol(yychar(), SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext())); } catch(NumberFormatException nfe){ //its too long for a Long var - return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); + return new ParsedSymbol(yychar(), SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); } } - {HexIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); } + {HexIntegerLiteral} { return new ParsedSymbol(yychar(), SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); } - {OctIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); } + {OctIntegerLiteral} { return new ParsedSymbol(yychar(), SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); } - {DoubleLiteral} { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); } + {DoubleLiteral} { return new ParsedSymbol(yychar(), SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); } /* comments */ {Comment} { yyline += count(yytext(),"\n"); } @@ -439,7 +444,7 @@ Preprocessor = \u00A7\u00A7 {Identifier} /* whitespace */ {WhiteSpace} { /*ignore*/ } /* identifiers */ - {Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } + {Identifier} { return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } } @@ -448,7 +453,7 @@ Preprocessor = \u00A7\u00A7 {Identifier} yybegin(YYINITIAL); repeatNum = 1; // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); + return new ParsedSymbol(itemStart, SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); } {OIdentifierCharacter} { for(int r=0;r> { return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); } +<> { return new ParsedSymbol(yychar(), SymbolGroup.EOF, SymbolType.EOF, null); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java index 85de564a0..f673c350b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java @@ -116,7 +116,17 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista * Inner functions */ private List innerFunctions; + + /** + * Parameter positions in the codde + */ + public List paramPositions; + /** + * Parameter registers + */ + private List paramRegisters; + /** * Register - this */ @@ -146,6 +156,10 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista * Register - global */ public static final int REGISTER_GLOBAL = 6; + + + + @Override public void visit(GraphTargetVisitorInterface visitor) { @@ -185,8 +199,9 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista * @param variables Variables * @param innerFunctions Inner functions * @param hasEval Has eval + * @param paramPositions Parameter positions */ - public FunctionActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, String functionName, List paramNames, Map regNames, List actions, List constants, int regStart, List variables, List innerFunctions, boolean hasEval) { + public FunctionActionItem(GraphSourceItem instruction, GraphSourceItem lineStartIns, String functionName, List paramNames, Map regNames, List actions, List constants, int regStart, List variables, List innerFunctions, boolean hasEval, List paramPositions, List paramRegisters) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.actions = actions; this.constants = constants; @@ -197,6 +212,8 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista this.variables = variables; this.innerFunctions = innerFunctions; this.hasEval = hasEval; + this.paramPositions = paramPositions; + this.paramRegisters = paramRegisters; } @Override @@ -267,7 +284,11 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista } String pname = paramNames.get(p); if (pname == null || pname.isEmpty()) { - pname = new RegisterNumber(regStart + p).translate(); + if (paramRegisters != null) { + pname = new RegisterNumber(paramRegisters.get(p)).translate(); + } else { + pname = new RegisterNumber(regStart + p).translate(); + } } HighlightData d = getSrcData(); d.localName = pname; @@ -336,6 +357,10 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista return true; } + public List getVariables() { + return variables; + } + private Set getDefinedVariableNames(List variables) { Set ret = new HashSet<>(); for (VariableActionItem v : variables) { @@ -360,6 +385,10 @@ public class FunctionActionItem extends ActionItem implements BranchStackResista } } + public List getInnerFunctions() { + return innerFunctions; + } + @Override public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index cf619aa5b..38e7dd5a5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -434,7 +434,7 @@ public class ActionScript2Parser { hasEval.setVal(true); } - FunctionActionItem retf = new FunctionActionItem(null, null, functionName, paramNames, new HashMap<>() /*?*/, body, constantPool, -1, subvariables, subfunctions, subHasEval.getVal()); + FunctionActionItem retf = new FunctionActionItem(null, null, functionName, paramNames, new HashMap<>() /*?*/, body, constantPool, -1, subvariables, subfunctions, subHasEval.getVal(), new ArrayList<>(), null); functions.add(retf); return retf; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2VariableParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2VariableParser.java new file mode 100644 index 000000000..398696a11 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2VariableParser.java @@ -0,0 +1,2479 @@ +/* + * Copyright (C) 2010-2025 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.action.parser.script; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.action.ActionGraphTargetDialect; +import com.jpexs.decompiler.flash.action.model.ConstantPool; +import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; +import com.jpexs.decompiler.flash.action.model.FunctionActionItem; +import com.jpexs.decompiler.flash.action.model.GetMemberActionItem; +import com.jpexs.decompiler.flash.action.parser.ActionParseException; +import com.jpexs.decompiler.flash.action.swf4.ActionPush; +import com.jpexs.decompiler.flash.action.swf4.ConstantIndex; +import com.jpexs.decompiler.flash.action.swf5.ActionConstantPool; +import com.jpexs.decompiler.flash.ecma.Undefined; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; +import com.jpexs.decompiler.flash.tags.base.ASMSource; +import com.jpexs.decompiler.flash.types.CLIPACTIONRECORD; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetDialect; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.helpers.CancellableWorker; +import com.jpexs.helpers.Reference; +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * ActionScript 1/2 parser. + * + * @author JPEXS + */ +public class ActionScript2VariableParser { + + private static final GraphTargetDialect DIALECT = ActionGraphTargetDialect.INSTANCE; + + /** + * Builtin classes that can be casted to + */ + public static final List BUILTIN_CASTS = Arrays.asList(new String[]{ + "flash.display.BitmapData", + "flash.external.ExternalInterface", + "flash.filters.BevelFilter", + "flash.filters.BitmapFilter", + "flash.filters.BlurFilter", + "flash.filters.ColorMatrixFilter", + "flash.filters.ConvolutionFilter", + "flash.filters.DisplacementMapFilter", + "flash.filters.DropShadowFilter", + "flash.filters.GlowFilter", + "flash.filters.GradientBevelFilter", + "flash.filters.GradientGlowFilter", + "flash.geom.ColorTransform", + "flash.geom.Matrix", + "flash.geom.Point", + "flash.geom.Rectangle", + "flash.geom.Transform", + "flash.net.FileReference", + "flash.net.FileReferenceList", + "flash.text.TextRenderer", + "Button", + "Camera", + "Color", + "ContextMenu", + "ContextMenuItem", + "CustomActions", + "Error", + "System.IME", + "LoadVars", + "LocalConnection", + "Microphone", + "MovieClip", + "MovieClipLoader", + "NetConnection", + "NetStream", + "PrintJob", + "System.security", + "SharedObject", + "Sound", + "TextField", + "TextFormat", + "TextSnapshot", + "XML", + "XMLNode", + "XMLSocket", + "XMLUI" + }); + + /** + * Swf version + */ + private final int swfVersion; + /** + * Swf classes + */ + private List swfClasses = new ArrayList<>(); + /** + * Charset + */ + private String charset; + + /** + * Constructor + * + * @param swf Swf + */ + public ActionScript2VariableParser(SWF swf) { + this.swfVersion = swf.version; + this.charset = swf.getCharset(); + parseSwfClasses(swf); + } + + private long uniqLast = 0; + + private final boolean debugMode = false; + + /** + * Parse SWF classes + * + * @param swf SWF + */ + private void parseSwfClasses(SWF swf) { + Map asms = swf.getASMs(false); + for (ASMSource s : asms.values()) { + if (s instanceof DoInitActionTag) { + String exportName = swf.getExportName(((DoInitActionTag) s).spriteId); + + if (exportName != null) { + final String PREFIX = "__Packages."; + if (exportName.startsWith(PREFIX)) { + String className = exportName.substring(PREFIX.length()); + swfClasses.add(className); + } + } + } + } + } + + private String uniqId() { + uniqLast++; + return "" + uniqLast; + } + + private void commands(boolean inFunction, boolean inMethod, int forinlevel, boolean inTellTarget, List variables, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + //List ret = new ArrayList<>(); + if (debugMode) { + System.out.println("commands:"); + } + while (command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval)) { + //empty + } + if (debugMode) { + System.out.println("/commands"); + } + //return ret; + } + + private boolean type(List variables) throws IOException, ActionParseException, InterruptedException { + //GraphTargetItem ret; + + ParsedSymbol s = lex(); + expectedIdentifier(s, lexer.yyline()); + VariableActionItem vret = new VariableActionItem(s.value.toString(), null, false); + vret.setPosition(s.position); + variables.add(vret); + //ret = vret; + s = lex(); + while (s.type == SymbolType.DOT) { + s = lex(); + expectedIdentifier(s, lexer.yyline()); + //ret = new GetMemberActionItem(null, null, ret, pushConst(s.value.toString())); + s = lex(); + } + lexer.pushback(s); + //return ret; + return true; + } + + private void expected(ParsedSymbol symb, int line, Object... expected) throws IOException, ActionParseException { + boolean found = false; + for (Object t : expected) { + if (symb.type == t) { + found = true; + } + if (symb.group == t) { + found = true; + } + } + if (!found) { + String expStr = ""; + boolean first = true; + for (Object e : expected) { + if (!first) { + expStr += " or "; + } + expStr += e; + first = false; + } + throw new ActionParseException("" + expStr + " expected but " + symb.type + " found", line); + } + } + + private ParsedSymbol expectedType(Object... type) throws IOException, ActionParseException, InterruptedException { + ParsedSymbol symb = lex(); + expected(symb, lexer.yyline(), type); + return symb; + } + + private ParsedSymbol lex() throws IOException, ActionParseException, InterruptedException { + if (CancellableWorker.isInterrupted()) { + throw new InterruptedException(); + } + ParsedSymbol ret = lexer.lex(); + if (debugMode) { + System.out.println(ret); + } + return ret; + } + + private List call(boolean inFunction, boolean inMethod, boolean inTellTarget, List variables, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + List ret = new ArrayList<>(); + //expected(SymbolType.PARENT_OPEN); //MUST BE HANDLED BY CALLER + ParsedSymbol s = lex(); + while (s.type != SymbolType.PARENT_CLOSE) { + if (s.type != SymbolType.COMMA) { + lexer.pushback(s); + } + //ret.add(; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.PARENT_CLOSE); + } + return ret; + } + + private void function(boolean withBody, String functionName, boolean isMethod, List variables, List functions, boolean inTellTarget, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + ParsedSymbol s; + expectedType(SymbolType.PARENT_OPEN); + s = lex(); + List paramNames = new ArrayList<>(); + List paramPositions = new ArrayList<>(); + + while (s.type != SymbolType.PARENT_CLOSE) { + if (s.type != SymbolType.COMMA) { + lexer.pushback(s); + } + s = lex(); + expectedIdentifier(s, lexer.yyline()); + paramNames.add(s.value.toString()); + paramPositions.add(s.position); + s = lex(); + if (s.type == SymbolType.COLON) { + type(variables); + s = lex(); + } + + if (!s.isType(SymbolType.COMMA, SymbolType.PARENT_CLOSE)) { + expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.PARENT_CLOSE); + } + } + List body = null; + List subvariables = new ArrayList<>(); + List subfunctions = new ArrayList<>(); + Reference subHasEval = new Reference<>(false); + if (withBody) { + expectedType(SymbolType.CURLY_OPEN); + //body = ; + commands(true, isMethod, 0, inTellTarget, subvariables, subfunctions, subHasEval); + expectedType(SymbolType.CURLY_CLOSE); + } + + if (subHasEval.getVal()) { + hasEval.setVal(true); + } + + FunctionActionItem retf = new FunctionActionItem(null, null, functionName, paramNames, new HashMap<>() /*?*/, body, constantPool, -1, subvariables, subfunctions, subHasEval.getVal(), paramPositions, null); + functions.add(retf); + //return retf; + } + + private boolean traits(boolean isInterface, GraphTargetItem nameStr, GraphTargetItem extendsStr, List implementsStr, List variables, List functions, boolean inTellTarget, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + + GraphTargetItem ret = null; + + ParsedSymbol s; + //List> traits = new ArrayList<>(); + //List traitsStatic = new ArrayList<>(); + + String classNameStr = ""; + if (nameStr instanceof GetMemberActionItem) { + GetMemberActionItem mem = (GetMemberActionItem) nameStr; + if (mem.memberName instanceof VariableActionItem) { + classNameStr = ((VariableActionItem) mem.memberName).getVariableName(); + } else if (mem.memberName instanceof DirectValueActionItem) { + classNameStr = ((DirectValueActionItem) mem.memberName).toStringNoQuotes(LocalData.empty); + } + } else if (nameStr instanceof VariableActionItem) { + VariableActionItem var = (VariableActionItem) nameStr; + classNameStr = var.getVariableName(); + } + + looptrait: + while (true) { + s = lex(); + boolean isGetter = false; + boolean isSetter = false; + boolean isStatic = false; + while (s.isType(SymbolType.STATIC, SymbolType.PUBLIC, SymbolType.PRIVATE)) { + if (s.type == SymbolType.STATIC) { + isStatic = true; + } + s = lex(); + } + switch (s.type) { + case FUNCTION: + s = lex(); + + if (s.type == SymbolType.SET) { + isSetter = true; + s = lex(); + } else if (s.type == SymbolType.GET) { + isGetter = true; + s = lex(); + } + + expectedIdentifier(s, lexer.yyline()); + String fname = s.value.toString(); + if (fname.equals(classNameStr)) { //constructor + //actually there's no difference, it's instance trait + } + if (!isInterface) { + if (isStatic) { + //FunctionActionItem ft =; + function(!isInterface, "", true, variables, functions, inTellTarget, hasEval); + /*ft.calculatedFunctionName = pushConst(fname); + ft.isSetter = isSetter; + ft.isGetter = isGetter; + traits.add(new MyEntry<>(ft.calculatedFunctionName, ft)); + traitsStatic.add(true);*/ + + if (isSetter) { + //add return getter automatically + /*GraphTargetItem callM = new CallMethodActionItem(null, null, nameStr, pushConst("__get__" + fname), new ArrayList<>()); + GraphTargetItem retV = new ReturnActionItem(null, null, callM); + ft.actions.add(retV);*/ + } + } else { + //FunctionActionItem ft = ; + function(!isInterface, "", true, variables, functions, inTellTarget, hasEval); + /*ft.calculatedFunctionName = pushConst(fname); + ft.isSetter = isSetter; + ft.isGetter = isGetter; + traits.add(new MyEntry<>(ft.calculatedFunctionName, ft)); + traitsStatic.add(false); + */ + if (isSetter) { + //add return getter automatically + /*GraphTargetItem thisVar = new VariableActionItem("this", null, false); + ft.addVariable((VariableActionItem) thisVar); + GraphTargetItem callM = new CallMethodActionItem(null, null, thisVar, pushConst("__get__" + fname), new ArrayList<>()); + GraphTargetItem retV = new ReturnActionItem(null, null, callM); + ft.actions.add(retV);*/ + } + } + + } + break; + case VAR: + s = lex(); + expectedIdentifier(s, lexer.yyline()); + //String ident = s.value.toString(); + s = lex(); + if (s.type == SymbolType.COLON) { + type(variables); + s = lex(); + } + if (s.type == SymbolType.ASSIGN) { + //traits.add(new MyEntry<>(pushConst(ident), ; + expression(false, false, false, true, variables, functions, false, hasEval); + //traitsStatic.add(isStatic); + s = lex(); + } + if (s.type != SymbolType.SEMICOLON) { + lexer.pushback(s); + } + break; + default: + lexer.pushback(s); + break looptrait; + + } + } + + /* + if (isInterface) { + return new InterfaceActionItem(nameStr, implementsStr); + } else { + return new ClassActionItem(nameStr, extendsStr, implementsStr, traits, traitsStatic); + }*/ + return true; + } + + private boolean expressionCommands(ParsedSymbol s, boolean inFunction, boolean inMethod, boolean inTellTarget, int forinlevel, List variables, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + if (debugMode) { + System.out.println("expressionCommands:"); + } + boolean ret = false; + switch (s.type) { + case DUPLICATEMOVIECLIP: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem src3 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem tar3 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem dep3 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new CloneSpriteActionItem(null, null, src3, tar3, dep3); + ret = true; + break; + case FSCOMMAND: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem command = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + //GraphTargetItem parameter = null; + if (s.isType(SymbolType.COMMA)) { + //parameter = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + } else { + lexer.pushback(s); + } + //ret = new FSCommandActionItem(null, null, command, parameter); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case FSCOMMAND2: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem arg0 = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + //List args = new ArrayList<>(); + //args.add(arg0); + s = lex(); + while (s.isType(SymbolType.COMMA)) { + //args.add(0,; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + } + expected(s, lexer.yyline(), SymbolType.PARENT_CLOSE); + //ret = new FSCommand2ActionItem(null, null, args); + ret = true; + break; + case SET: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem name1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem value1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new SetVariableActionItem(null, null, name1, value1); + //((SetVariableActionItem) ret).forceUseSet = true; + hasEval.setVal(true); //FlashPro does this (using definelocal for funcs) only for eval func, but we will also use set since it is generated by obfuscated identifiers + ret = true; + break; + case TRACE: + expectedType(SymbolType.PARENT_OPEN); + //ret = new TraceActionItem(null, null, (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + + case GETURL: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem url = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + expected(s, lexer.yyline(), SymbolType.PARENT_CLOSE, SymbolType.COMMA); + //int getuMethod = 0; + //GraphTargetItem target; + if (s.type == SymbolType.COMMA) { + //target = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (s.type == SymbolType.COMMA) { + s = lex(); + expected(s, lexer.yyline(), SymbolType.STRING); + if (s.value.equals("GET")) { + //getuMethod = 1; + } else if (s.value.equals("POST")) { + //getuMethod = 2; + } else { + throw new ActionParseException("Invalid method, \"GET\" or \"POST\" expected.", lexer.yyline()); + } + } else { + lexer.pushback(s); + } + } else { + lexer.pushback(s); + //target = new DirectValueActionItem(null, null, 0, "", new ArrayList<>()); + } + expectedType(SymbolType.PARENT_CLOSE); + //ret = new GetURL2ActionItem(null, null, url, target, getuMethod); + ret = true; + break; + case GOTOANDSTOP: + case GOTOANDPLAY: + SymbolType gtKind = s.type; + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem gtsFrame = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + int gtsSceneBias = -1; + s = lex(); + if (s.type == SymbolType.COMMA) { //Handle scene? + /*if ((gtsFrame instanceof DirectValueActionItem) && (((DirectValueActionItem) gtsFrame).value instanceof Long)) { + gtsSceneBias = (int) (long) (Long) ((DirectValueActionItem) gtsFrame).value; + } else { + throw new ActionParseException("Scene bias must be number", lexer.yyline()); + }*/ + + //gtsFrame = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + } else { + lexer.pushback(s); + } + //ret = new GotoFrame2ActionItem(null, null, gtsFrame, gtsSceneBias != -1, gtKind == SymbolType.GOTOANDPLAY, gtsSceneBias); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case NEXTFRAME: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new NextFrameActionItem(null, null); + ret = true; + break; + case PLAY: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new PlayActionItem(null, null); + ret = true; + break; + case PREVFRAME: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new PrevFrameActionItem(null, null); + ret = true; + break; + case STOP: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new StopActionItem(null, null); + ret = true; + break; + case STOPALLSOUNDS: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new StopAllSoundsActionItem(null, null); + ret = true; + break; + case TOGGLEHIGHQUALITY: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new ToggleHighQualityActionItem(null, null); + ret = true; + break; + + case STOPDRAG: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new StopDragActionItem(null, null); + ret = true; + break; + + case UNLOADMOVIE: + case UNLOADMOVIENUM: + SymbolType unloadType = s.type; + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem unTargetOrNum = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + /*if (unloadType == SymbolType.UNLOADMOVIE) { + ret = new UnLoadMovieActionItem(null, null, unTargetOrNum); + } + if (unloadType == SymbolType.UNLOADMOVIENUM) { + ret = new UnLoadMovieNumActionItem(null, null, unTargetOrNum); + }*/ + ret = true; + break; + case PRINT: + case PRINTASBITMAP: + case PRINTASBITMAPNUM: + case PRINTNUM: + SymbolType printType = s.type; + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem printTarget = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem printBBox = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + + /* + switch (printType) { + case PRINT: + ret = new PrintActionItem(null, null, printTarget, printBBox); + break; + case PRINTNUM: + ret = new PrintNumActionItem(null, null, printTarget, printBBox); + break; + case PRINTASBITMAP: + ret = new PrintAsBitmapActionItem(null, null, printTarget, printBBox); + break; + case PRINTASBITMAPNUM: + ret = new PrintAsBitmapNumActionItem(null, null, printTarget, printBBox); + break; + }*/ + ret = true; + break; + case LOADVARIABLES: + case LOADMOVIE: + case LOADVARIABLESNUM: + case LOADMOVIENUM: + SymbolType loadType = s.type; + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem url2 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem targetOrNum = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + + s = lex(); + expected(s, lexer.yyline(), SymbolType.PARENT_CLOSE, SymbolType.COMMA); + //int lvmethod = 0; + if (s.type == SymbolType.COMMA) { + s = lex(); + expected(s, lexer.yyline(), SymbolType.STRING); + if (s.value.equals("POST")) { + //lvmethod = 2; + } else if (s.value.equals("GET")) { + //lvmethod = 1; + } else { + throw new ActionParseException("Invalid method, \"GET\" or \"POST\" expected.", lexer.yyline()); + } + } else { + lexer.pushback(s); + } + expectedType(SymbolType.PARENT_CLOSE); + /*switch (loadType) { + case LOADVARIABLES: + ret = new LoadVariablesActionItem(null, null, url2, targetOrNum, lvmethod); + break; + case LOADMOVIE: + ret = new LoadMovieActionItem(null, null, url2, targetOrNum, lvmethod); + break; + case LOADVARIABLESNUM: + ret = new LoadVariablesNumActionItem(null, null, url2, targetOrNum, lvmethod); + break; + case LOADMOVIENUM: + ret = new LoadMovieNumActionItem(null, null, url2, targetOrNum, lvmethod); + break; + }*/ + ret = true; + break; + case REMOVEMOVIECLIP: + expectedType(SymbolType.PARENT_OPEN); + //ret = new RemoveSpriteActionItem(null, null, (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case STARTDRAG: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem dragTarget = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + /*GraphTargetItem lockCenter; + GraphTargetItem constrain; + GraphTargetItem x1 = null; + GraphTargetItem y1 = null; + GraphTargetItem x2 = null; + GraphTargetItem y2 = null;*/ + s = lex(); + if (s.type == SymbolType.COMMA) { + //lockCenter = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (s.type == SymbolType.COMMA) { + //constrain = new DirectValueActionItem(null, null, 0, 1L, new ArrayList<>()); + //x1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (s.type == SymbolType.COMMA) { + //y1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (s.type == SymbolType.COMMA) { + //x2 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (s.type == SymbolType.COMMA) { + //y2 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + } else { + lexer.pushback(s); + //y2 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + } + } else { + lexer.pushback(s); + //x2 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + //y2 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + } + } else { + lexer.pushback(s); + //x2 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + //y2 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + //y1 = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + + } + } else { + lexer.pushback(s); + //constrain = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + } + } else { + //lockCenter = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + //constrain = new DirectValueActionItem(null, null, 0, 0L, new ArrayList<>()); + lexer.pushback(s); + } + expectedType(SymbolType.PARENT_CLOSE); + //ret = new StartDragActionItem(null, null, dragTarget, lockCenter, constrain, x1, y1, x2, y2); + ret = true; + break; + case CALL: + expectedType(SymbolType.PARENT_OPEN); + //ret = new CallActionItem(null, null, (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case GETVERSION: + expectedType(SymbolType.PARENT_OPEN); + //ret = new GetVersionActionItem(null, null); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case MBORD: + expectedType(SymbolType.PARENT_OPEN); + //ret = new MBCharToAsciiActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case MBCHR: + expectedType(SymbolType.PARENT_OPEN); + //ret = new MBAsciiToCharActionItem(null, null,; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case MBLENGTH: + expectedType(SymbolType.PARENT_OPEN); + //ret = new MBStringLengthActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case MBSUBSTRING: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem val1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem index1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem len1 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new MBStringExtractActionItem(null, null, val1, index1, len1); + ret = true; + break; + case SUBSTR: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem val2 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem index2 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.COMMA); + //GraphTargetItem len2 = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new StringExtractActionItem(null, null, val2, index2, len2); + ret = true; + break; + case LENGTH: + expectedType(SymbolType.PARENT_OPEN); + //ret = new StringLengthActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case RANDOM: + expectedType(SymbolType.PARENT_OPEN); + //ret = new RandomNumberActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case INT: + expectedType(SymbolType.PARENT_OPEN); + //ret = new ToIntegerActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case NUMBER_OP: + ParsedSymbol sopn = s; + s = lex(); + if (s.type == SymbolType.DOT) { + lexer.pushback(s); + VariableActionItem vi = new VariableActionItem(sopn.value.toString(), null, false); + vi.setPosition(sopn.position); + variables.add(vi); + //ret = vi; + ret = true; + } else { + expected(s, lexer.yyline(), SymbolType.PARENT_OPEN); + //ret = new ToNumberActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + } + break; + case STRING_OP: + ParsedSymbol sop = s; + s = lex(); + if (s.type == SymbolType.DOT) { + lexer.pushback(s); + VariableActionItem vi2 = new VariableActionItem(sop.value.toString(), null, false); + vi2.setPosition(sop.position); + variables.add(vi2); + //ret = vi2; + ret = true; + } else { + expected(s, lexer.yyline(), SymbolType.PARENT_OPEN); + //ret = new ToStringActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //ret = memberOrCall(ret, inFunction, inMethod, variables, functions); + ret = true; + } + break; + case ORD: + expectedType(SymbolType.PARENT_OPEN); + //ret = new CharToAsciiActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case CHR: + expectedType(SymbolType.PARENT_OPEN); + //ret = new AsciiToCharActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + case GETTIMER: + expectedType(SymbolType.PARENT_OPEN); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new GetTimeActionItem(null, null); + ret = true; + break; + case TARGETPATH: + expectedType(SymbolType.PARENT_OPEN); + //ret = new TargetPathActionItem(null, null, (expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval))); + expectedType(SymbolType.PARENT_CLOSE); + ret = true; + break; + default: + return false; + } + if (debugMode) { + System.out.println("/expressionCommands"); + } + return ret; + } + + private boolean isIdentifier(ParsedSymbol s, Object... exceptions) { + for (Object ex : exceptions) { + if (s.isType(ex)) { + return true; + } + } + return s.isType(SymbolType.IDENTIFIER, + SymbolType.TRUE, SymbolType.FALSE, SymbolGroup.GLOBALCONST, + SymbolType.GET, SymbolType.SET, + SymbolType.EACH, SymbolGroup.GLOBALFUNC, + SymbolType.NUMBER_OP, SymbolType.STRING_OP); + } + + private void expectedIdentifier(ParsedSymbol s, int line, Object... exceptions) throws IOException, ActionParseException { + for (Object ex : exceptions) { + if (s.isType(ex)) { + return; + } + } + if (!isIdentifier(s)) { + throw new ActionParseException(SymbolType.IDENTIFIER + " expected but " + s.type + " found", line); + } + } + + private boolean command(boolean inFunction, boolean inMethod, int forinlevel, boolean inTellTarget, boolean mustBeCommand, List variables, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + LexBufferer buf = new LexBufferer(); + lexer.addListener(buf); + if (debugMode) { + System.out.println("command:"); + } + boolean ret = false; + ParsedSymbol s = lex(); + if (s.type == SymbolType.EOF) { + return false; + } + if (s.group == SymbolGroup.GLOBALFUNC) { + ParsedSymbol s2 = lex(); + if (s2.type != SymbolType.PARENT_OPEN) { + lexer.removeListener(buf); + buf.pushAllBack(lexer); + + ret = expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if ((s != null) && (s.type != SymbolType.SEMICOLON)) { + lexer.pushback(s); + } + return ret; + } else { + lexer.pushback(s2); + } + } + + switch (s.type) { + case WITH: + expectedType(SymbolType.PARENT_OPEN); + expression(inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + expectedType(SymbolType.CURLY_OPEN); + commands(inFunction, inMethod, forinlevel, inTellTarget, variables, functions, hasEval); + expectedType(SymbolType.CURLY_CLOSE); + //ret = new WithActionItem(null, null, wvar, wcmd); + ret = true; + break; + case DELETE: + //GraphTargetItem varDel = + expression(inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + /*if (varDel instanceof GetMemberActionItem) { + GetMemberActionItem gm = (GetMemberActionItem) varDel; + ret = new DeleteActionItem(null, null, gm.object, gm.memberName); + } else if (varDel instanceof VariableActionItem) { + variables.remove(varDel); + ret = new DeleteActionItem(null, null, null, pushConst(((VariableActionItem) varDel).getVariableName())); + } else if ((varDel instanceof EvalActionItem) || (varDel instanceof ParenthesisItem)) { + ret = new DeleteActionItem(null, null, null, varDel.value); + } else if (varDel instanceof DirectValueActionItem) { + ret = new DeleteActionItem(null, null, null, varDel); + } else { + ret = new DeleteActionItem(null, null, null, varDel); + }*/ + ret = true; + + break; + case TELLTARGET: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem tellTarget = + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + expectedType(SymbolType.CURLY_OPEN); + //List tellcmds = ; + commands(inFunction, inMethod, forinlevel, true, variables, functions, hasEval); + expectedType(SymbolType.CURLY_CLOSE); + /*TellTargetActionItem tt = new TellTargetActionItem(null, null, tellTarget, tellcmds); + if (inTellTarget) { + tt.nested = true; + } + ret = tt;*/ + ret = true; + + break; + + case IFFRAMELOADED: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem iflExpr = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + expectedType(SymbolType.CURLY_OPEN); + //List iflComs = ; + commands(inFunction, inMethod, forinlevel, inTellTarget, variables, functions, hasEval); + expectedType(SymbolType.CURLY_CLOSE); + //ret = new IfFrameLoadedActionItem(iflExpr, iflComs, null, null); + ret = true; + + break; + case CLASS: + type(variables); + s = lex(); + if (s.type == SymbolType.EXTENDS) { + type(variables); + s = lex(); + } + if (s.type == SymbolType.IMPLEMENTS) { + do { + type(variables); + s = lex(); + } while (s.type == SymbolType.COMMA); + } + expected(s, lexer.yyline(), SymbolType.CURLY_OPEN); + traits(false, null, null, new ArrayList<>(), variables, functions, inTellTarget, hasEval); + expectedType(SymbolType.CURLY_CLOSE); + ret = true; + break; + case INTERFACE: + //GraphTargetItem interfaceTypeStr = ; + type(variables); + s = lex(); + + if (s.type == SymbolType.EXTENDS) { + do { + type(variables); + s = lex(); + } while (s.type == SymbolType.COMMA); + } + expected(s, lexer.yyline(), SymbolType.CURLY_OPEN); + traits(true, null, null, new ArrayList<>(), variables, functions, inTellTarget, hasEval); + expectedType(SymbolType.CURLY_CLOSE); + ret = true; + break; + case FUNCTION: + s = lexer.lex(); + expectedIdentifier(s, lexer.yyline()); + function(true, s.value.toString(), false, variables, functions, inTellTarget, hasEval); + break; + case VAR: + s = lex(); + expectedIdentifier(s, lexer.yyline()); + String varIdentifier = s.value.toString(); + int varPosition = s.position; + s = lex(); + if (s.type == SymbolType.COLON) { + type(variables); + s = lex(); + //TODO: handle value type + } + + if (s.type == SymbolType.ASSIGN) { + //GraphTargetItem varval = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + //ret = new VariableActionItem(varIdentifier, varval, true); + VariableActionItem vret = new VariableActionItem(varIdentifier, null, true); + vret.setPosition(varPosition); + variables.add(vret); + //ret = vret + } else { + VariableActionItem vret = new VariableActionItem(varIdentifier, new DirectValueActionItem(Undefined.INSTANCE), true); + vret.setPosition(varPosition); + variables.add(vret); + //ret = vret + lexer.pushback(s); + } + ret = true; + break; + case CURLY_OPEN: + commands(inFunction, inMethod, forinlevel, inTellTarget, variables, functions, hasEval); + expectedType(SymbolType.CURLY_CLOSE); + ret = true; + break; + case INCREMENT: //preincrement + case DECREMENT: //predecrement + //GraphTargetItem varincdec = ; + expression(inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + /*if (s.type == SymbolType.INCREMENT) { + ret = new PreIncrementActionItem(null, null, varincdec); + } else if (s.type == SymbolType.DECREMENT) { + ret = new PreDecrementActionItem(null, null, varincdec); + }*/ + ret = true; + break; + case SUPER: //constructor call + ParsedSymbol ss2 = lex(); + if (ss2.type == SymbolType.PARENT_OPEN) { + List args = call(inFunction, inMethod, inTellTarget, variables, functions, hasEval); + VariableActionItem supItem = new VariableActionItem(s.value.toString(), null, false); + supItem.setPosition(s.position); + variables.add(supItem); + //ret = new CallMethodActionItem(null, null, supItem, new DirectValueActionItem(null, null, 0, Undefined.INSTANCE, constantPool), args); + ret = true; + } else { //no constructor call, but it could be calling parent methods... => handle in expression + lexer.pushback(ss2); + lexer.pushback(s); + } + break; + case IF: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem ifExpr = (; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //GraphTargetItem onTrue = ; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + //List onTrueList = new ArrayList<>(); + //onTrueList.add(onTrue); + s = lex(); + //List onFalseList = null; + if (s.type == SymbolType.ELSE) { + //onFalseList = new ArrayList<>(); + //onFalseList.add( + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + //); + } else { + lexer.pushback(s); + } + //ret = new IfItem(DIALECT, null, null, ifExpr, onTrueList, onFalseList); + ret = true; + break; + case WHILE: + expectedType(SymbolType.PARENT_OPEN); + //List whileExpr = new ArrayList<>(); + //whileExpr.add( + expression(inFunction, inMethod, inTellTarget, true, variables, functions, true, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //List whileBody = new ArrayList<>(); + //whileBody.add( + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + //ret = new WhileItem(DIALECT, null, null, null, whileExpr, whileBody); + ret = true; + break; + case DO: + //List doBody = new ArrayList<>(); + //doBody.add(; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + expectedType(SymbolType.WHILE); + expectedType(SymbolType.PARENT_OPEN); + //List doExpr = new ArrayList<>(); + //doExpr.add(; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, true, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + //ret = new DoWhileItem(DIALECT, null, null, null, doBody, doExpr); + ret = true; + break; + case FOR: + expectedType(SymbolType.PARENT_OPEN); + s = lex(); + boolean forin = false; + //GraphTargetItem collection = null; + String objIdent; + VariableActionItem item = null; + int innerExprReg = 0; + boolean define = false; + if (s.type == SymbolType.VAR || isIdentifier(s)) { + ParsedSymbol s2 = null; + ParsedSymbol ssel = s; + if (s.type == SymbolType.VAR) { + s2 = lex(); + ssel = s2; + define = true; + } + + if (isIdentifier(ssel)) { + objIdent = ssel.value.toString(); + + ParsedSymbol s3 = lex(); + if (s3.type == SymbolType.IN) { + if (inFunction) { + /*for (int i = 0; i < 256; i++) { + if (!registerVars.containsValue(i)) { + registerVars.put(objIdent, i); + innerExprReg = i; + break; + } + }*/ + } + + item = new VariableActionItem(objIdent, null, define); + item.setPosition(ssel.position); + + item.setStoreValue(new GraphTargetItem(DIALECT) { + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + return writer; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + + //toSource is Empty + }); + + variables.add(item); + + //collection = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + forin = true; + } else { + lexer.pushback(s3); + if (s2 != null) { + lexer.pushback(s2); + } + lexer.pushback(s); + } + } else { + if (s2 != null) { + lexer.pushback(s2); + } + lexer.pushback(s); + } + } else { + lexer.pushback(s); + } + /*List forFinalCommands = new ArrayList<>(); + GraphTargetItem forExpr = null; + List forFirstCommands = new ArrayList<>();*/ + if (!forin) { + //GraphTargetItem fc = ; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + /*if (fc != null) { //can be empty command + forFirstCommands.add(fc); + }*/ + //forExpr = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + /*if (forExpr == null) { + forExpr = new TrueItem(DIALECT, null, null); + }*/ + expectedType(SymbolType.SEMICOLON); + //GraphTargetItem fcom = ; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + /*if (fcom != null) { + forFinalCommands.add(fcom); + }*/ + } + expectedType(SymbolType.PARENT_CLOSE); + //List forBody = new ArrayList<>(); + //forBody.add(; + command(inFunction, inMethod, forin ? forinlevel + 1 : forinlevel, inTellTarget, true, variables, functions, hasEval); + /*if (forin) { + ret = new ForInActionItem(null, null, null, item, collection, forBody); + } else { + ret = new ForItem(DIALECT, null, null, null, forFirstCommands, forExpr, forFinalCommands, forBody); + }*/ + ret = true; + break; + case SWITCH: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem switchExpr = ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + expectedType(SymbolType.CURLY_OPEN); + s = lex(); + //ret.addAll(switchExpr); + /*int exprReg = 0; + for (int i = 0; i < 256; i++) { + if (!registerVars.containsValue(i)) { + registerVars.put("__switch" + uniqId(), i); + exprReg = i; + break; + } + }*/ + /*List> caseIfs = new ArrayList<>(); + List> caseCmds = new ArrayList<>(); + List caseExprsAll = new ArrayList<>(); + List valueMapping = new ArrayList<>();*/ + int pos = 0; + while (s.type == SymbolType.CASE || s.type == SymbolType.DEFAULT) { + //List caseExprs; = new ArrayList<>(); + while (s.type == SymbolType.CASE || s.type == SymbolType.DEFAULT) { + if (s.type != SymbolType.DEFAULT) { + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + } + //GraphTargetItem curCaseExpr = s.type == SymbolType.DEFAULT ? new DefaultItem(DIALECT) :; + //caseExprs.add(curCaseExpr); + expectedType(SymbolType.COLON); + s = lex(); + //caseExprsAll.add(curCaseExpr); + //valueMapping.add(pos); + } + pos++; + lexer.pushback(s); + //List caseCmd = ; + commands(inFunction, inMethod, forinlevel, inTellTarget, variables, functions, hasEval); + //caseCmds.add(caseCmd); + s = lex(); + } + expected(s, lexer.yyline(), SymbolType.CURLY_CLOSE); + //ret = new SwitchItem(DIALECT, null, null, null, switchExpr, caseExprsAll, caseCmds, valueMapping); + ret = true; + break; + case BREAK: + //ret = new BreakItem(DIALECT, null, null, 0); //? There is no more than 1 level continue/break in AS1/2 + ret = true; + break; + case CONTINUE: + //ret = new ContinueItem(DIALECT, null, null, 0); //? There is no more than 1 level continue/break in AS1/2 + ret = true; + break; + case RETURN: + //GraphTargetItem retexpr =; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + /*if (retexpr == null) { + retexpr = new DirectValueActionItem(null, null, 0, Undefined.INSTANCE, new ArrayList<>()); + }*/ + //ret = new ReturnActionItem(null, null, retexpr); + ret = true; + break; + case TRY: + //List tryCommands = new ArrayList<>(); + //tryCommands.add(; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + s = lex(); + boolean found = false; + /*List> catchCommands = new ArrayList<>(); + List catchExceptionNames = new ArrayList<>(); + List catchExceptionTypes = new ArrayList<>(); + */ + while (s.type == SymbolType.CATCH) { + expectedType(SymbolType.PARENT_OPEN); + s = lex(); + expectedIdentifier(s, lexer.yyline(), SymbolType.STRING); + //catchExceptionNames.add(pushConst((String) s.value)); + s = lex(); + if (s.type == SymbolType.COLON) { + //catchExceptionTypes.add(; + type(variables); + } else { + //catchExceptionTypes.add(null); + lexer.pushback(s); + } + expectedType(SymbolType.PARENT_CLOSE); + //List cc = new ArrayList<>(); + //cc.add(; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + //catchCommands.add(cc); + s = lex(); + found = true; + } + //List finallyCommands = null; + if (s.type == SymbolType.FINALLY) { + //finallyCommands = new ArrayList<>(); + //finallyCommands.add(; + command(inFunction, inMethod, forinlevel, inTellTarget, true, variables, functions, hasEval); + found = true; + s = lex(); + } + if (!found) { + expected(s, lexer.yyline(), SymbolType.CATCH, SymbolType.FINALLY); + } + lexer.pushback(s); + //ret = new TryActionItem(tryCommands, catchExceptionNames, catchExceptionTypes, catchCommands, finallyCommands); + ret = true; + break; + case THROW: + //ret = new ThrowActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + break; + case SEMICOLON: //empty command + if (debugMode) { + System.out.println("/command"); + } + //return new EmptyCommand(DIALECT); + return true; + case DIRECTIVE: + switch ((String) s.value) { + case "strict": + //ret = new StrictModeActionItem(null, null, 1); + ret = true; + break; + default: + throw new ActionParseException("Unknown directive: #" + s.value, lexer.yyline()); + } + break; + default: + lexer.pushback(s); + ret = expression(inFunction, inMethod, inTellTarget, true, variables, functions, true, hasEval); + } + if (debugMode) { + System.out.println("/command"); + } + lexer.removeListener(buf); + if (!ret) { //can be popped expression + buf.pushAllBack(lexer); + ret = expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + } + s = lex(); + if ((s != null) && (s.type != SymbolType.SEMICOLON)) { + lexer.pushback(s); + } + + return ret; + } + + private boolean expression(boolean inFunction, boolean inMethod, boolean inTellTarget, boolean allowRemainder, List variables, List functions, boolean allowComma, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + if (debugMode) { + System.out.println("expression:"); + } + //List commaItems = new ArrayList<>(); + ParsedSymbol symb; + do { + boolean prim = expressionPrimary(false, inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, true, hasEval); + if (!prim) { + return false; + } + //GraphTargetItem expr = ; + expression1(prim, GraphTargetItem.NOPRECEDENCE, inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, hasEval); + //commaItems.add(expr); + symb = lex(); + } while (allowComma && symb != null && symb.type == SymbolType.COMMA); + if (symb != null) { + lexer.pushback(symb); + } + if (debugMode) { + System.out.println("/expression"); + } + /*if (commaItems.size() == 1) { + return commaItems.get(0); + } + return new CommaExpressionItem(DIALECT, null, null, commaItems);*/ + return true; + } + + private ParsedSymbol peekLex() throws IOException, ActionParseException, InterruptedException { + ParsedSymbol lookahead = lex(); + lexer.pushback(lookahead); + return lookahead; + } + + private static final String[] operatorIdentifiers = new String[]{"add", "eq", "ne", "lt", "ge", "gt", "le"}; + + private boolean isBinaryOperator(ParsedSymbol s) { + if (s.type == SymbolType.IDENTIFIER && Arrays.asList(operatorIdentifiers).contains(s.value.toString())) { + return true; + } + return s.type.isBinary(); + } + + private int getSymbPrecedence(ParsedSymbol s) { + if (s.type == SymbolType.IDENTIFIER && Arrays.asList(operatorIdentifiers).contains(s.value.toString())) { + switch (s.value.toString()) { + case "add": + return GraphTargetItem.PRECEDENCE_ADDITIVE; + case "eq": + case "ne": + return GraphTargetItem.PRECEDENCE_EQUALITY; + case "lt": + case "ge": + case "gt": + case "le": + return GraphTargetItem.PRECEDENCE_RELATIONAL; + } + } + return s.type.getPrecedence(); + } + + private boolean expression1(boolean lhs, int min_precedence, boolean inFunction, boolean inMethod, boolean inTellTarget, boolean allowRemainder, List variables, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + ParsedSymbol op; + boolean rhs; + boolean mhs = false; + ParsedSymbol lookahead = peekLex(); + if (debugMode) { + System.out.println("expression1:"); + } + //Note: algorithm from http://en.wikipedia.org/wiki/Operator-precedence_parser + //with relation operators reversed as we have precedence in reverse order + while (isBinaryOperator(lookahead) && getSymbPrecedence(lookahead) <= /* >= on wiki */ min_precedence) { + op = lookahead; + lex(); + + //Note: Handle ternar operator as Binary + //http://stackoverflow.com/questions/13681293/how-can-i-incorporate-ternary-operators-into-a-precedence-climbing-algorithm + if (op.type == SymbolType.TERNAR) { + if (debugMode) { + System.out.println("ternar-middle:"); + } + mhs = expression(inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, false, hasEval); + expectedType(SymbolType.COLON); + if (debugMode) { + System.out.println("/ternar-middle"); + } + } + + rhs = expressionPrimary(allowRemainder, inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, true, hasEval); + if (rhs == false) { + lexer.pushback(op); + break; + } + + lookahead = peekLex(); + while ((isBinaryOperator(lookahead) && getSymbPrecedence(lookahead) < /* > on wiki */ getSymbPrecedence(op)) + || (lookahead.type.isRightAssociative() && getSymbPrecedence(lookahead) == getSymbPrecedence(op))) { + rhs = expression1(rhs, getSymbPrecedence(lookahead), inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, hasEval); + lookahead = peekLex(); + } + + switch (op.type) { + + case TERNAR: + //lhs = new TernarOpItem(DIALECT, null, null, lhs, mhs, rhs); + lhs = true; + break; + case SHIFT_LEFT: + //lhs = new LShiftActionItem(null, null, lhs, rhs); + lhs = true; + break; + case SHIFT_RIGHT: + //lhs = new RShiftActionItem(null, null, lhs, rhs); + lhs = true; + break; + case USHIFT_RIGHT: + //lhs = new URShiftActionItem(null, null, lhs, rhs); + lhs = true; + break; + case BITAND: + //lhs = new BitAndActionItem(null, null, lhs, rhs); + lhs = true; + break; + case BITOR: + //lhs = new BitOrActionItem(null, null, lhs, rhs); + lhs = true; + break; + case DIVIDE: + //lhs = new DivideActionItem(null, null, lhs, rhs); + lhs = true; + break; + case MODULO: + //lhs = new ModuloActionItem(null, null, lhs, rhs); + lhs = true; + break; + case EQUALS: + //lhs = new EqActionItem(null, null, lhs, rhs, true/*FIXME SWF version?*/); + lhs = true; + break; + case STRICT_EQUALS: + //lhs = new StrictEqActionItem(null, null, lhs, rhs); + lhs = true; + break; + case NOT_EQUAL: + //lhs = new NeqActionItem(null, null, lhs, rhs, true/*FIXME SWF version?*/); + lhs = true; + break; + case STRICT_NOT_EQUAL: + //lhs = new StrictNeqActionItem(null, null, lhs, rhs); + lhs = true; + break; + case LOWER_THAN: + //lhs = new LtActionItem(null, null, lhs, rhs, true/*FIXME SWF version?*/); + lhs = true; + break; + case LOWER_EQUAL: + //lhs = new LeActionItem(null, null, lhs, rhs); + lhs = true; + break; + case GREATER_THAN: + //lhs = new GtActionItem(null, null, lhs, rhs); + lhs = true; + break; + case GREATER_EQUAL: + //lhs = new GeActionItem(null, null, lhs, rhs, true/*FIXME SWF version?*/); + lhs = true; + break; + case AND: + //lhs = new AndItem(DIALECT, null, null, lhs, rhs); + lhs = true; + break; + case OR: + //lhs = new OrItem(DIALECT, null, null, lhs, rhs); + lhs = true; + break; + case FULLAND: + //lhs = new AndActionItem(null, null, lhs, rhs); + lhs = true; + break; + case FULLOR: + //lhs = new OrActionItem(null, null, lhs, rhs); + lhs = true; + break; + case MINUS: + //lhs = new SubtractActionItem(null, null, lhs, rhs); + lhs = true; + break; + case MULTIPLY: + //lhs = new MultiplyActionItem(null, null, lhs, rhs); + lhs = true; + break; + case PLUS: + //lhs = new AddActionItem(null, null, lhs, rhs, swfVersion >= 5); + lhs = true; + break; + case XOR: + //lhs = new BitXorActionItem(null, null, lhs, rhs); + lhs = true; + break; + case INSTANCEOF: + //lhs = new InstanceOfActionItem(null, null, lhs, rhs); + lhs = true; + break; + case ASSIGN: + case ASSIGN_BITAND: + case ASSIGN_BITOR: + case ASSIGN_DIVIDE: + case ASSIGN_MINUS: + case ASSIGN_MODULO: + case ASSIGN_MULTIPLY: + case ASSIGN_PLUS: + case ASSIGN_SHIFT_LEFT: + case ASSIGN_SHIFT_RIGHT: + case ASSIGN_USHIFT_RIGHT: + case ASSIGN_XOR: + /*GraphTargetItem assigned = rhs; + switch (op.type) { + case ASSIGN: + //assigned = assigned; + break; + case ASSIGN_BITAND: + assigned = new BitAndActionItem(null, null, lhs, assigned); + break; + case ASSIGN_BITOR: + assigned = new BitOrActionItem(null, null, lhs, assigned); + break; + case ASSIGN_DIVIDE: + assigned = new DivideActionItem(null, null, lhs, assigned); + break; + case ASSIGN_MINUS: + assigned = new SubtractActionItem(null, null, lhs, assigned); + break; + case ASSIGN_MODULO: + assigned = new ModuloActionItem(null, null, lhs, assigned); + break; + case ASSIGN_MULTIPLY: + assigned = new MultiplyActionItem(null, null, lhs, assigned); + break; + case ASSIGN_PLUS: + assigned = new AddActionItem(null, null, lhs, assigned, swfVersion >= 5); + break; + case ASSIGN_SHIFT_LEFT: + assigned = new LShiftActionItem(null, null, lhs, assigned); + break; + case ASSIGN_SHIFT_RIGHT: + assigned = new RShiftActionItem(null, null, lhs, assigned); + break; + case ASSIGN_USHIFT_RIGHT: + assigned = new URShiftActionItem(null, null, lhs, assigned); + break; + case ASSIGN_XOR: + assigned = new BitXorActionItem(null, null, lhs, assigned); + break; + } + if (lhs instanceof GetPropertyActionItem) { + lhs = new SetPropertyActionItem(null, null, ((GetPropertyActionItem) lhs).target, ((GetPropertyActionItem) lhs).propertyIndex, assigned); + } else if (lhs instanceof VariableActionItem) { + if (assigned != rhs) { + lhs = new VariableActionItem(((VariableActionItem) lhs).getVariableName(), assigned, false); + variables.add((VariableActionItem) lhs); + } else { + ((VariableActionItem) lhs).setStoreValue(assigned); + ((VariableActionItem) lhs).setDefinition(false); + } + } else if (lhs instanceof GetMemberActionItem) { + lhs = new SetMemberActionItem(null, null, ((GetMemberActionItem) lhs).object, ((GetMemberActionItem) lhs).memberName, assigned); + } else { + throw new ActionParseException("Invalid assignment", lexer.yyline()); + }*/ + lhs = true; + break; + case IDENTIFIER: + switch (op.value.toString()) { + case "add": + //lhs = new StringAddActionItem(null, null, lhs, rhs); + lhs = true; + break; + case "eq": + //lhs = new StringEqActionItem(null, null, lhs, rhs); + lhs = true; + break; + case "ne": + //lhs = new StringNeActionItem(null, null, lhs, rhs); + lhs = true; + break; + case "lt": + //lhs = new StringLtActionItem(null, null, lhs, rhs); + lhs = true; + break; + case "ge": + //lhs = new StringGeActionItem(null, null, lhs, rhs); + lhs = true; + break; + case "gt": + //lhs = new StringGtActionItem(null, null, lhs, rhs); + lhs = true; + break; + case "le": + //lhs = new StringLeActionItem(null, null, lhs, rhs); + lhs = true; + break; + } + break; + } + } + + if (debugMode) { + System.out.println("/expression1"); + } + return lhs; + } + + private boolean isType(GraphTargetItem item) { + if (item == null) { + return false; + } + while (item instanceof GetMemberActionItem) { + item = ((GetMemberActionItem) item).object; + } + return (item instanceof VariableActionItem); + } + + private int brackets(List ret, boolean inFunction, boolean inMethod, boolean inTellTarget, List variables, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + ParsedSymbol s = lex(); + int arrCnt = 0; + if (s.type == SymbolType.BRACKET_OPEN) { + s = lex(); + + while (s.type != SymbolType.BRACKET_CLOSE) { + if (s.type != SymbolType.COMMA) { + lexer.pushback(s); + } + arrCnt++; + //ret.add(; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (!s.isType(SymbolType.COMMA, SymbolType.BRACKET_CLOSE)) { + expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.BRACKET_CLOSE); + } + } + } else { + lexer.pushback(s); + return -1; + } + return arrCnt; + } + + private boolean handleVariable(ParsedSymbol s, boolean ret, List variables, Reference allowMemberOrCall, boolean inFunction, boolean inMethod, boolean inTellTarget, List functions, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + if (s.value.equals("not")) { + //ret = new NotItem(DIALECT, null, null, ; + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, true, hasEval); + ret = true; + } else { + String varName = s.value.toString(); + + VariableActionItem vret = new VariableActionItem(varName, null, false); + vret.setPosition(s.position); + variables.add(vret); + //ret = vret; + allowMemberOrCall.setVal(true); + ret = true; + } + return ret; + } + + private boolean expressionPrimary(boolean allowEmpty, boolean inFunction, boolean inMethod, boolean inTellTarget, boolean allowRemainder, List variables, List functions, boolean allowCall, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + if (debugMode) { + System.out.println("primary:"); + } + boolean allowMemberOrCall = false; + boolean ret = false; + ParsedSymbol s = lex(); + + switch (s.type) { + case PREPROCESSOR: + expectedType(SymbolType.PARENT_OPEN); + switch ("" + s.value) { + //AS 1/2: + //AS2: + case "constant": + s = lexer.lex(); + expected(s, lexer.yyline(), SymbolType.INTEGER); + //ret = new UnresolvedConstantActionItem((int) (long) (Long) s.value); + ret = true; + break; + case "enumerate": + //ret = new EnumerateActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, false, hasEval); + ret = true; + break; + //Both ASs + case "dup": + //ret = new DuplicateItem(DIALECT, null, null,; + expression(inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, false, hasEval); + ret = true; + break; + case "push": + //ret = new PushItem(; + expression(inFunction, inMethod, inTellTarget, allowRemainder, variables, functions, false, hasEval); + ret = true; + break; + case "pop": + //ret = new PopItem(DIALECT, null, null); + ret = true; + break; + case "strict": + s = lexer.lex(); + expected(s, lexer.yyline(), SymbolType.INTEGER); + //ret = new StrictModeActionItem(null, null, (int) (long) (Long) s.value); + ret = true; + break; + case "goto": //TODO + throw new ActionParseException("Compiling §§" + s.value + " is not available, sorry", lexer.yyline()); + default: + throw new ActionParseException("Unknown preprocessor instruction: §§" + s.value, lexer.yyline()); + + } + expectedType(SymbolType.PARENT_CLOSE); + break; + case NEGATE: + versionRequired(s, 5); + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, true, hasEval); + //ret = new BitXorActionItem(null, null, ret, new DirectValueActionItem(4.294967295E9)); + ret = true; + break; + case MINUS: + s = lex(); + if (s.isType(SymbolType.DOUBLE)) { + //ret = new DirectValueActionItem(null, null, 0, -(double) (Double) s.value, new ArrayList<>()); + ret = true; + + } else if (s.isType(SymbolType.INTEGER)) { + //ret = new DirectValueActionItem(null, null, 0, -(long) (Long) s.value, new ArrayList<>()); + ret = true; + + } else { + lexer.pushback(s); + //GraphTargetItem num =; + expressionPrimary(false, inFunction, inMethod, inTellTarget, true, variables, functions, true, hasEval); + ret = true; + /*if ((num instanceof DirectValueActionItem) + && (((DirectValueActionItem) num).value instanceof Long)) { + ((DirectValueActionItem) num).value = -(Long) ((DirectValueActionItem) num).value; + ret = num; + } else if ((num instanceof DirectValueActionItem) + && (((DirectValueActionItem) num).value instanceof Double)) { + Double d = (Double) ((DirectValueActionItem) num).value; + if (d.isInfinite()) { + ((DirectValueActionItem) num).value = Double.NEGATIVE_INFINITY; + } else { + ((DirectValueActionItem) num).value = -d; + } + ret = (num); + } else if ((num instanceof DirectValueActionItem) + && (((DirectValueActionItem) num).value instanceof Float)) { + ((DirectValueActionItem) num).value = -(Float) ((DirectValueActionItem) num).value; + ret = (num); + } else { + ret = (new SubtractActionItem(null, null, new DirectValueActionItem(null, null, 0, (Long) 0L, new ArrayList<>()), num)); + }*/ + } + break; + case TYPEOF: + //ret = new TypeOfActionItem(null, null,; + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, true, hasEval); + ret = true; + allowMemberOrCall = true; + break; + case TRUE: + //ret = new DirectValueActionItem(null, null, 0, Boolean.TRUE, new ArrayList<>()); + ret = true; + allowMemberOrCall = true; + break; + case NULL: + //ret = new DirectValueActionItem(null, null, 0, Null.INSTANCE, new ArrayList<>());/ + ret = true; + allowMemberOrCall = true; + break; + case UNDEFINED: + //ret = new DirectValueActionItem(null, null, 0, Undefined.INSTANCE, new ArrayList<>());r + ret = true; + allowMemberOrCall = true; + break; + case FALSE: + //ret = new DirectValueActionItem(null, null, 0, Boolean.FALSE, new ArrayList<>()); + ret = true; + allowMemberOrCall = true; + break; + case CURLY_OPEN: //Object literal + s = lex(); + //List objectNames = new ArrayList<>(); + //List objectValues = new ArrayList<>(); + while (s.type != SymbolType.CURLY_CLOSE) { + if (s.type != SymbolType.COMMA) { + lexer.pushback(s); + } + s = lex(); + expectedIdentifier(s, lexer.yyline()); + //objectNames.add(0, pushConst((String) s.value)); + expectedType(SymbolType.COLON); + //objectValues.add(0, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + s = lex(); + if (!s.isType(SymbolType.COMMA, SymbolType.CURLY_CLOSE)) { + expected(s, lexer.yyline(), SymbolType.COMMA, SymbolType.CURLY_CLOSE); + } + } + //ret = new InitObjectActionItem(null, null, objectNames, objectValues); + ret = true; + allowMemberOrCall = true; + break; + case BRACKET_OPEN: //Array literal or just brackets + lexer.pushback(s); + List inBrackets = new ArrayList<>(); + int arrCnt = brackets(inBrackets, inFunction, inMethod, inTellTarget, variables, functions, hasEval); + //ret = new InitArrayActionItem(null, null, inBrackets); + ret = true; + allowMemberOrCall = true; + break; + case FUNCTION: + s = lex(); + String fname = ""; + if (isIdentifier(s)) { + fname = s.value.toString(); + } else { + lexer.pushback(s); + } + //ret = ; + function(true, fname, false, variables, functions, inTellTarget, hasEval); + ret = true; + allowMemberOrCall = true; + break; + case STRING: + //ret = pushConst(s.value.toString()); + ret = true; + allowMemberOrCall = true; + break; + case NEWLINE: + //ret = new DirectValueActionItem(null, null, 0, "\n", new ArrayList<>()); + ret = true; + allowMemberOrCall = true; + break; + case INTEGER: + case DOUBLE: + //ret = new DirectValueActionItem(null, null, 0, s.value, new ArrayList<>()); + ret = true; + allowMemberOrCall = true; + break; + case DELETE: + //GraphTargetItem varDel = ; + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, true, hasEval); + /*if (varDel instanceof GetMemberActionItem) { + GetMemberActionItem gm = (GetMemberActionItem) varDel; + ret = new DeleteActionItem(null, null, gm.object, gm.memberName); + } else { + if (varDel instanceof VariableActionItem) { + varDel = pushConst(((VariableActionItem) varDel).getVariableName()); + } + ret = new DeleteActionItem(null, null, null, varDel); + }*/ + ret = true; + break; + case INCREMENT: + case DECREMENT: //preincrement + //GraphTargetItem prevar = ; + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, true, hasEval); + /*if (s.type == SymbolType.INCREMENT) { + ret = new PreIncrementActionItem(null, null, prevar); + } + if (s.type == SymbolType.DECREMENT) { + ret = new PreDecrementActionItem(null, null, prevar); + }*/ + ret = true; + + break; + case NOT: + //ret = new NotItem(DIALECT, null, null,; + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, true, hasEval); + ret = true; + + break; + case PARENT_OPEN: + boolean pexpr = expression(inFunction, inMethod, inTellTarget, true, variables, functions, true, hasEval); + if (!pexpr) { + throw new ActionParseException("Expression expected", lexer.yyline()); + } + //ret = new ParenthesisItem(DIALECT, null, null, pexpr); + expectedType(SymbolType.PARENT_CLOSE); + allowMemberOrCall = true; + ret = true; + break; + case NEW: + //GraphTargetItem newvar = ; + ParsedSymbol s1 = lex(); + if (s1.type == SymbolType.NUMBER_OP || s1.type == SymbolType.STRING_OP) { + ParsedSymbol s2 = lex(); + if (s2.type == SymbolType.PARENT_OPEN) { + lexer.pushback(s2); + } else { + lexer.pushback(s2); + lexer.pushback(s1); + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + } + } else { + lexer.pushback(s1); + expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + } + expectedType(SymbolType.PARENT_OPEN); + call(inFunction, inMethod, inTellTarget, variables, functions, hasEval); + /*expressionPrimary(false, inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + if (newvar instanceof ToNumberActionItem) { + List args = new ArrayList<>(); + if (((ToNumberActionItem) newvar).value != null) { + args.add(((ToNumberActionItem) newvar).value); + } + ret = new NewObjectActionItem(null, null, pushConst("Number"), args); + } else if (newvar instanceof ToStringActionItem) { + List args = new ArrayList<>(); + if (((ToStringActionItem) newvar).value != null) { + args.add(((ToStringActionItem) newvar).value); + } + ret = new NewObjectActionItem(null, null, pushConst("String"), args); + } else if (newvar instanceof GetMemberActionItem) { + + GetMemberActionItem ca = (GetMemberActionItem) newvar; + expectedType(SymbolType.PARENT_OPEN); + List args = call(inFunction, inMethod, inTellTarget, variables, functions, hasEval); + ret = new NewMethodActionItem(null, null, ca.object, ca.memberName, args); + } else if (newvar instanceof VariableActionItem) { + VariableActionItem cf = (VariableActionItem) newvar; + expectedType(SymbolType.PARENT_OPEN); + List args = call(inFunction, inMethod, inTellTarget, variables, functions, hasEval); + ret = new NewObjectActionItem(null, null, pushConst(cf.getVariableName()), args); + } else { + throw new ActionParseException("Invalid new item", lexer.yyline()); + }*/ + ret = true; //Here we do not check for new item type + allowMemberOrCall = true; + + break; + case EVAL: + expectedType(SymbolType.PARENT_OPEN); + //GraphTargetItem evar = new EvalActionItem(null, null, ; + expression(inFunction, inMethod, inTellTarget, true, variables, functions, false, hasEval); + expectedType(SymbolType.PARENT_CLOSE); + hasEval.setVal(true); + //ret = evar; + allowMemberOrCall = true; + ret = true; + break; + case IDENTIFIER: + case THIS: + case SUPER: + Reference allowMemberOrCallRef = new Reference<>(allowMemberOrCall); + ret = handleVariable(s, ret, variables, allowMemberOrCallRef, inFunction, inMethod, inTellTarget, functions, hasEval); + allowMemberOrCall = allowMemberOrCallRef.getVal(); + + break; + default: + + boolean isGlobalFuncVar = false; + if (s.group == SymbolGroup.GLOBALFUNC) { + ParsedSymbol s2 = peekLex(); + if (s2.type != SymbolType.PARENT_OPEN) { + Reference allowMemberOrCallRef2 = new Reference<>(allowMemberOrCall); + ret = handleVariable(s, ret, variables, allowMemberOrCallRef2, inFunction, inMethod, inTellTarget, functions, hasEval); + allowMemberOrCall = allowMemberOrCallRef2.getVal(); + isGlobalFuncVar = true; + } + } + + if (!isGlobalFuncVar) { + boolean excmd = expressionCommands(s, inFunction, inMethod, inTellTarget, -1, variables, functions, hasEval); + if (excmd) { + //? + ret = excmd; + allowMemberOrCall = true; //? + break; + } + lexer.pushback(s); + } + } + + if (allowMemberOrCall && ret) { + ret = memberOrCall(ret, inFunction, inMethod, inTellTarget, variables, functions, allowCall, hasEval); + } + if (debugMode) { + System.out.println("/primary"); + } + return ret; + } + + private boolean isCastOp(GraphTargetItem item) { + LocalData localData = LocalData.create(new ConstantPool(constantPool)); + List items = new ArrayList<>(); + while (item instanceof GetMemberActionItem) { + GetMemberActionItem mem = (GetMemberActionItem) item; + if (mem.memberName instanceof DirectValueActionItem) { + items.add(0, mem.memberName.toStringNoQuotes(localData)); + } + item = mem.object; + } + if (item instanceof VariableActionItem) { + VariableActionItem v = (VariableActionItem) item; + items.add(0, v.getVariableName()); + } + + if (items.isEmpty()) { + return false; + } + String fullName = String.join(".", items); + if (BUILTIN_CASTS.contains(fullName)) { + return true; + } + if (swfClasses.contains(fullName)) { + return true; + } + return false; + } + + private boolean memberOrCall(boolean ret, boolean inFunction, boolean inMethod, boolean inTellTarget, List variables, List functions, boolean allowCall, Reference hasEval) throws IOException, ActionParseException, InterruptedException { + ParsedSymbol op = lex(); + while (op.isType(SymbolType.PARENT_OPEN, SymbolType.BRACKET_OPEN, SymbolType.DOT)) { + if (op.type == SymbolType.PARENT_OPEN) { + if (!allowCall) { + break; + } + //List args = ; + call(inFunction, inMethod, inTellTarget, variables, functions, hasEval); + /*if (isCastOp(ret) && args.size() == 1) { + ret = new CastOpActionItem(null, null, ret, args.get(0)); + } else if (ret instanceof GetMemberActionItem) { + GetMemberActionItem mem = (GetMemberActionItem) ret; + ret = new CallMethodActionItem(null, null, mem.object, mem.memberName, args); + } else if (ret instanceof VariableActionItem) { + VariableActionItem var = (VariableActionItem) ret; + + if (var.getVariableName().equals("getProperty") + && args.size() == 2 + && (args.get(1) instanceof VariableActionItem) + && (Action.propertyNamesListLowerCase.contains(((VariableActionItem) args.get(1)).getVariableName().toLowerCase()))) { + ret = new GetPropertyActionItem(null, null, args.get(0), Action.propertyNamesListLowerCase.indexOf(((VariableActionItem) args.get(1)).getVariableName().toLowerCase())); + } else if (var.getVariableName().equals("setProperty") + && args.size() == 3 + && (args.get(1) instanceof VariableActionItem) + && (Action.propertyNamesListLowerCase.contains(((VariableActionItem) args.get(1)).getVariableName().toLowerCase()))) { + ret = new SetPropertyActionItem(null, null, args.get(0), Action.propertyNamesListLowerCase.indexOf(((VariableActionItem) args.get(1)).getVariableName().toLowerCase()), args.get(2)); + } else { + ret = new CallFunctionActionItem(null, null, var, args); + } + } else if (ret instanceof EvalActionItem) { + EvalActionItem ev = (EvalActionItem) ret; + ret = new CallFunctionActionItem(null, null, ev.value, args); + } else { + ret = new CallFunctionActionItem(null, null, ret, args); + }*/ + ret = true; + } + if (op.type == SymbolType.BRACKET_OPEN) { + //GraphTargetItem rhs = ; + expression(inFunction, inMethod, inTellTarget, false, variables, functions, false, hasEval); + //ret = new GetMemberActionItem(null, null, ret, rhs); + expectedType(SymbolType.BRACKET_CLOSE); + ret = true; + } + if (op.type == SymbolType.DOT) { + ParsedSymbol s = lex(); + expectedIdentifier(s, lexer.yyline(), SymbolType.THIS, SymbolType.SUPER); + + //ret = new GetMemberActionItem(null, null, ret, pushConst(s.value.toString())); + ret = true; + } + op = lex(); + } + + switch (op.type) { + case INCREMENT: //postincrement + /*if (!(ret instanceof VariableActionItem) && !(ret instanceof GetMemberActionItem)) { + throw new ActionParseException("Invalid assignment", lexer.yyline()); + }*/ + //ret = new PostIncrementActionItem(null, null, ret); + ret = true; + op = lex(); + break; + case DECREMENT: //postdecrement + /*if (!(ret instanceof VariableActionItem) && !(ret instanceof GetMemberActionItem)) { + throw new ActionParseException("Invalid assignment", lexer.yyline()); + }*/ + //ret = new PostDecrementActionItem(null, null, ret); + ret = true; + op = lex(); + break; + } + + lexer.pushback(op); + return ret; + } + + private DirectValueActionItem pushConst(String s) throws IOException, ActionParseException { + + //ActionConstantPool was introduced in SWF 5 + if (swfVersion < 5) { + return new DirectValueActionItem(null, null, 0, s, constantPool); + } + + int index = constantPool.indexOf(s); + if (index == -1) { + if (ActionConstantPool.calculateSize(constantPool) + ActionConstantPool.calculateSize(s) <= 0xffff) { + // constant pool is not full + constantPool.add(s); + index = constantPool.indexOf(s); + } + } + + if (index == -1) { + return new DirectValueActionItem(null, null, 0, s, constantPool); + } + + return new DirectValueActionItem(null, null, 0, new ConstantIndex(index), constantPool); + } + + private ActionScriptLexer lexer = null; + + private List constantPool; + + /** + * Convert a string to a high-level model. + * + * @param str The string to convert + * @throws ActionParseException On parse error + * @throws IOException On I/O error + * @throws InterruptedException On interrupt + */ + public void parse(String str, Map> definitionPosToReferences, Map referenceToDefinition) throws ActionParseException, IOException, InterruptedException { + this.constantPool = new ArrayList<>(); + lexer = new ActionScriptLexer(new StringReader(str)); + if (swfVersion >= ActionScriptLexer.SWF_VERSION_CASE_SENSITIVE) { + lexer.setCaseSensitiveIdentifiers(true); + } + + ParsedSymbol symb = lexer.lex(); + boolean inOnHandler = false; + + if (symb.type == SymbolType.IDENTIFIER && ("on".equals(symb.value) || "onClipEvent".equals(symb.value))) { + expectedType(SymbolType.PARENT_OPEN); + symb = lexer.lex(); + boolean condEmpty = true; + while (symb.type == SymbolType.IDENTIFIER) { + condEmpty = false; + switch ((String) symb.value) { + case "press": + break; + case "release": + break; + case "releaseOutside": + break; + case "rollOver": + break; + case "rollOut": + break; + case "dragOut": + break; + case "dragOver": + break; + case "keyPress": + symb = lexer.lex(); + expected(symb, lexer.yyline(), SymbolType.STRING); + Integer key = CLIPACTIONRECORD.stringToKey((String) symb.value); + if (key == null) { + throw new ActionParseException("Invalid key", lexer.yyline()); + } + break; + case "keyUp": + break; + case "keyDown": + break; + case "mouseUp": + break; + case "mouseDown": + break; + case "mouseMove": + break; + case "unload": + break; + case "enterFrame": + break; + case "load": + break; + case "data": + break; + default: + throw new ActionParseException("Unrecognized event type", lexer.yyline()); + } + symb = lexer.lex(); + if (symb.type == SymbolType.PARENT_CLOSE) { + break; + } + expected(symb, lexer.yyline(), SymbolType.COMMA); + symb = lexer.lex(); + } + expected(symb, lexer.yyline(), SymbolType.PARENT_CLOSE); + if (condEmpty) { + throw new ActionParseException("condition must be non empty", lexer.yyline()); + } + expectedType(SymbolType.CURLY_OPEN); + inOnHandler = true; + } else { + lexer.pushback(symb); + } + + List vars = new ArrayList<>(); + List functions = new ArrayList<>(); + Reference hasEval = new Reference<>(false); + commands(false, false, 0, false, vars, functions, hasEval); + Map varNameToDefinitionPosition = new LinkedHashMap<>(); + for (VariableActionItem v : vars) { + if (v.isDefinition()) { + varNameToDefinitionPosition.put(v.getVariableName(), v.getPosition()); + definitionPosToReferences.put(v.getPosition(), new ArrayList<>()); + } else { + if (varNameToDefinitionPosition.containsKey(v.getVariableName())) { + int definitionPos = varNameToDefinitionPosition.get(v.getVariableName()); + definitionPosToReferences.get(definitionPos).add(v.getPosition()); + referenceToDefinition.put(v.getPosition(), definitionPos); + } + } + } + for (FunctionActionItem f : functions) { + parseFunction(f, varNameToDefinitionPosition, definitionPosToReferences, referenceToDefinition); + } + + if (inOnHandler) { + expectedType(SymbolType.CURLY_CLOSE); + } + + if (lexer.lex().type != SymbolType.EOF) { + throw new ActionParseException("Parsing finished before end of the file", lexer.yyline()); + } + } + + private void parseFunction(FunctionActionItem f, Map parentVarNameToDefinitionPosition, Map> definitionPosToReferences, Map referenceToDefinition) { + Map varNameToDefinitionPosition = new LinkedHashMap<>(); + varNameToDefinitionPosition.putAll(parentVarNameToDefinitionPosition); + + for (int i = 0; i < f.paramNames.size(); i++) { + varNameToDefinitionPosition.put(f.paramNames.get(i), f.paramPositions.get(i)); + definitionPosToReferences.put(f.paramPositions.get(i), new ArrayList<>()); + } + + for (VariableActionItem v : f.getVariables()) { + if (v.isDefinition()) { + varNameToDefinitionPosition.put(v.getVariableName(), v.getPosition()); + definitionPosToReferences.put(v.getPosition(), new ArrayList<>()); + } else { + if (varNameToDefinitionPosition.containsKey(v.getVariableName())) { + int definitionPos = varNameToDefinitionPosition.get(v.getVariableName()); + definitionPosToReferences.get(definitionPos).add(v.getPosition()); + referenceToDefinition.put(v.getPosition(), definitionPos); + } + } + } + for (FunctionActionItem g : f.getInnerFunctions()) { + parseFunction(g, varNameToDefinitionPosition, definitionPosToReferences, referenceToDefinition); + } + } + + private List generateActionList(List tree, List constantPool, boolean secondRun) throws CompilationException { + ActionSourceGenerator gen = new ActionSourceGenerator(swfVersion, constantPool, charset); + SourceGeneratorLocalData localData = new SourceGeneratorLocalData(new HashMap<>(), 0, Boolean.FALSE, 0); + localData.secondRun = secondRun; + return gen.generate(localData, tree); + } + + private List actionsFromTree(List tree, List constantPool, boolean doOrder, String charset) throws CompilationException, NeedsGenerateAgainException { + List ret = new ArrayList<>(); + + List srcList = generateActionList(tree, constantPool, doOrder == false); + + if (doOrder) { + List orderedConstantPool = new ArrayList<>(); + boolean canChangeInPlace; + int lastIndex = constantPool.size() - 1; + if (lastIndex <= ActionPush.MAX_CONSTANT_INDEX_TYPE8) { + //can change constant indices as ActionPush contains always 1 byte per constant + canChangeInPlace = true; + } else { + //variable number bytes per ActionPush constant, + //must generate again to make relative offsets in jumps work + canChangeInPlace = false; + } + + //create ordered constant pool, update constantindices when we can changeinplace + for (GraphSourceItem src : srcList) { + if (src instanceof ActionPush) { + ActionPush ap = (ActionPush) src; + for (int i = 0; i < ap.values.size(); i++) { + Object val = ap.values.get(i); + if (val instanceof ConstantIndex) { + ConstantIndex ci = (ConstantIndex) val; + String cval = constantPool.get(ci.index); + int orderedIndex = orderedConstantPool.indexOf(cval); + if (orderedIndex == -1) { + orderedIndex = orderedConstantPool.size(); + orderedConstantPool.add(cval); + } + if (canChangeInPlace) { + //Do NOT change ci.index directly - it may be cloned from other location + ap.values.set(i, new ConstantIndex(orderedIndex)); + } + } + } + } + } + if (!canChangeInPlace) { + //generate again, as number of bytes per ActionPush can change + throw new NeedsGenerateAgainException(orderedConstantPool); + } + constantPool = orderedConstantPool; + } + for (GraphSourceItem s : srcList) { + if (s instanceof Action) { + ret.add((Action) s); + } + } + if (!constantPool.isEmpty()) { + ret.add(0, new ActionConstantPool(constantPool, charset)); + } + return ret; + } + + private void versionRequired(ParsedSymbol s, int min) throws ActionParseException { + versionRequired(s.value.toString(), min, Integer.MAX_VALUE); + } + + private void versionRequired(ParsedSymbol s, int min, int max) throws ActionParseException { + versionRequired(s.value.toString(), min, max); + } + + private void versionRequired(String type, int min, int max) throws ActionParseException { + if (min == max && swfVersion != min) { + throw new ActionParseException(type + " requires SWF version " + min, lexer.yyline()); + } + if (swfVersion < min) { + throw new ActionParseException(type + " requires at least SWF version " + min, lexer.yyline()); + } + if (swfVersion > max) { + throw new ActionParseException(type + " requires SWF version lower than " + max, lexer.yyline()); + } + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java index 148c54b87..339df80a4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScriptLexer.java @@ -1,16 +1,18 @@ +/* The following code was generated by JFlex 1.6.0 */ + /* - * Copyright (C) 2010-2025 JPEXS, All rights reserved. - * + * Copyright (C) 2010-2016 JPEXS, All rights reserved. + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ @@ -104,140 +106,143 @@ public final class ActionScriptLexer { "\2\0\1\6\2\0\2\6\2\7\2\0\12\7\20\0\1\6\3\7"+ "\1\0\10\6\1\0\3\6\1\0\27\6\1\0\12\6\1\0\5\6"+ "\2\0\1\7\1\6\7\7\1\0\3\7\1\0\4\7\7\0\2\7"+ - "\6\0\2\6\1\0\2\6\2\7\2\0\12\7\1\0\2\6\15\0"+ - "\4\7\11\6\1\0\3\6\1\0\51\6\2\7\1\6\7\7\1\0"+ - "\3\7\1\0\4\7\1\6\5\0\3\6\1\7\7\0\3\6\2\7"+ - "\2\0\12\7\12\0\6\6\1\0\3\7\1\0\22\6\3\0\30\6"+ - "\1\0\11\6\1\0\1\6\2\0\7\6\3\0\1\7\4\0\6\7"+ - "\1\0\1\7\1\0\10\7\6\0\12\7\2\0\2\7\15\0\60\6"+ - "\1\7\2\6\7\7\4\0\10\6\10\7\1\0\12\7\47\0\2\6"+ - "\1\0\1\6\1\0\5\6\1\0\30\6\1\0\1\6\1\0\12\6"+ - "\1\7\2\6\11\7\1\6\2\0\5\6\1\0\1\6\1\0\6\7"+ - "\2\0\12\7\2\0\4\6\40\0\1\6\27\0\2\7\6\0\12\7"+ - "\13\0\1\7\1\0\1\7\1\0\1\7\4\0\2\7\10\6\1\0"+ - "\44\6\4\0\24\7\1\0\2\7\5\6\13\7\1\0\44\7\11\0"+ - "\1\7\71\0\53\6\24\7\1\6\12\7\6\0\6\6\4\7\4\6"+ - "\3\7\1\6\3\7\2\6\7\7\3\6\4\7\15\6\14\7\1\6"+ - "\17\7\2\0\46\6\1\0\1\6\5\0\1\6\2\0\53\6\1\0"+ - "\u014d\6\1\0\4\6\2\0\7\6\1\0\1\6\1\0\4\6\2\0"+ - "\51\6\1\0\4\6\2\0\41\6\1\0\4\6\2\0\7\6\1\0"+ - "\1\6\1\0\4\6\2\0\17\6\1\0\71\6\1\0\4\6\2\0"+ - "\103\6\2\0\3\7\40\0\20\6\20\0\126\6\2\0\6\6\3\0"+ - "\u026c\6\2\0\21\6\1\0\32\6\5\0\113\6\3\0\13\6\7\0"+ - "\22\6\4\7\11\0\23\6\3\7\13\0\22\6\2\7\14\0\15\6"+ - "\1\0\3\6\1\0\2\7\14\0\64\6\40\7\3\0\1\6\3\0"+ - "\2\6\1\7\2\0\12\7\41\0\17\7\6\0\131\6\7\0\5\6"+ - "\2\7\42\6\1\7\1\6\5\0\106\6\12\0\37\6\1\0\14\7"+ - "\4\0\14\7\12\0\12\7\36\6\2\0\5\6\13\0\54\6\4\0"+ - "\32\6\6\0\12\7\46\0\27\6\5\7\4\0\65\6\12\7\1\0"+ - "\35\7\2\0\13\7\6\0\12\7\15\0\1\6\10\0\16\7\1\0"+ - "\20\7\61\0\5\7\57\6\21\7\10\6\3\0\12\7\21\0\11\7"+ - "\14\0\3\7\36\6\15\7\2\6\12\7\54\6\16\7\14\0\44\6"+ - "\24\7\10\0\12\7\3\0\3\6\12\7\44\6\2\0\11\6\7\0"+ - "\53\6\2\0\3\6\20\0\3\7\1\0\25\7\4\6\1\7\6\6"+ - "\1\7\2\6\3\7\1\6\5\0\300\6\100\7\u0116\6\2\0\6\6"+ - "\2\0\46\6\2\0\6\6\2\0\10\6\1\0\1\6\1\0\1\6"+ - "\1\0\1\6\1\0\37\6\2\0\65\6\1\0\7\6\1\0\1\6"+ - "\3\0\3\6\1\0\7\6\3\0\4\6\2\0\6\6\4\0\15\6"+ - "\5\0\3\6\1\0\7\6\16\0\5\7\30\0\1\126\1\126\5\7"+ - "\20\0\2\6\23\0\1\6\13\0\5\7\1\0\12\7\1\0\1\6"+ - "\15\0\1\6\20\0\15\6\3\0\41\6\17\0\15\7\4\0\1\7"+ - "\3\0\14\7\21\0\1\6\4\0\1\6\2\0\12\6\1\0\1\6"+ - "\3\0\5\6\6\0\1\6\1\0\1\6\1\0\1\6\1\0\4\6"+ - "\1\0\13\6\2\0\4\6\5\0\5\6\4\0\1\6\21\0\51\6"+ - "\u0a77\0\345\6\6\0\4\6\3\7\2\6\14\0\46\6\1\0\1\6"+ - "\5\0\1\6\2\0\70\6\7\0\1\6\17\0\1\7\27\6\11\0"+ - "\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0"+ - "\7\6\1\0\7\6\1\0\7\6\1\0\40\7\57\0\1\6\u01d5\0"+ - "\3\6\31\0\11\6\6\7\1\0\5\6\2\0\5\6\4\0\126\6"+ - "\2\0\2\7\2\0\3\6\1\0\132\6\1\0\4\6\5\0\53\6"+ - "\1\0\136\6\21\0\40\6\60\0\20\6\u0200\0\u19c0\6\100\0\u568d\6"+ - "\103\0\56\6\2\0\u010d\6\3\0\20\6\12\7\2\6\24\0\57\6"+ - "\1\7\4\0\12\7\1\0\37\6\2\7\120\6\2\7\45\0\11\6"+ - "\2\0\147\6\2\0\100\6\5\0\2\6\1\0\1\6\1\0\5\6"+ - "\30\0\20\6\1\7\3\6\1\7\4\6\1\7\27\6\5\7\4\0"+ - "\1\7\13\0\1\6\7\0\64\6\14\0\2\7\62\6\22\7\12\0"+ - "\12\7\6\0\22\7\6\6\3\0\1\6\1\0\2\6\13\7\34\6"+ - "\10\7\2\0\27\6\15\7\14\0\35\6\3\0\4\7\57\6\16\7"+ - "\16\0\1\6\12\7\6\0\5\6\1\7\12\6\12\7\5\6\1\0"+ - "\51\6\16\7\11\0\3\6\1\7\10\6\2\7\2\0\12\7\6\0"+ - "\27\6\3\0\1\6\3\7\62\6\1\7\1\6\3\7\2\6\2\7"+ - "\5\6\2\7\1\6\1\7\1\6\30\0\3\6\2\0\13\6\5\7"+ - "\2\0\3\6\2\7\12\0\6\6\2\0\6\6\2\0\6\6\11\0"+ - "\7\6\1\0\7\6\1\0\53\6\1\0\16\6\6\0\163\6\10\7"+ - "\1\0\2\7\2\0\12\7\6\0\u2ba4\6\14\0\27\6\4\0\61\6"+ - "\u2104\0\u016e\6\2\0\152\6\46\0\7\6\14\0\5\6\5\0\1\6"+ - "\1\7\12\6\1\0\15\6\1\0\5\6\1\0\1\6\1\0\2\6"+ - "\1\0\2\6\1\0\154\6\41\0\u016b\6\22\0\100\6\2\0\66\6"+ - "\50\0\15\6\3\0\20\7\20\0\20\7\3\0\2\6\30\0\3\6"+ - "\31\0\1\6\6\0\5\6\1\0\207\6\2\0\1\7\4\0\1\6"+ - "\13\0\12\7\7\0\32\6\4\0\1\6\1\0\32\6\13\0\131\6"+ - "\3\0\6\6\2\0\6\6\2\0\6\6\2\0\3\6\3\0\2\6"+ - "\3\0\2\6\22\0\3\7\4\0\14\6\1\0\32\6\1\0\23\6"+ - "\1\0\2\6\1\0\17\6\2\0\16\6\42\0\173\6\105\0\65\6"+ - "\210\0\1\7\202\0\35\6\3\0\61\6\17\0\1\7\37\0\40\6"+ - "\15\0\36\6\5\0\46\6\5\7\5\0\36\6\2\0\44\6\4\0"+ - "\10\6\1\0\5\6\52\0\236\6\2\0\12\7\6\0\44\6\4\0"+ - "\44\6\4\0\50\6\10\0\64\6\14\0\13\6\1\0\17\6\1\0"+ - "\7\6\1\0\2\6\1\0\13\6\1\0\17\6\1\0\7\6\1\0"+ - "\2\6\103\0\u0137\6\11\0\26\6\12\0\10\6\30\0\6\6\1\0"+ - "\52\6\1\0\11\6\105\0\6\6\2\0\1\6\1\0\54\6\1\0"+ - "\2\6\3\0\1\6\2\0\27\6\12\0\27\6\11\0\37\6\101\0"+ - "\23\6\1\0\2\6\12\0\26\6\12\0\32\6\106\0\70\6\6\0"+ - "\2\6\100\0\1\6\3\7\1\0\2\7\5\0\4\7\4\6\1\0"+ - "\3\6\1\0\35\6\2\0\3\7\4\0\1\7\40\0\35\6\3\0"+ - "\35\6\43\0\10\6\1\0\34\6\2\7\31\0\66\6\12\0\26\6"+ - "\12\0\23\6\15\0\22\6\156\0\111\6\67\0\63\6\15\0\63\6"+ - "\15\0\44\6\4\7\10\0\12\7\u0146\0\52\6\1\0\2\7\3\0"+ - "\2\6\116\0\35\6\12\0\1\6\10\0\26\6\13\7\37\0\22\6"+ - "\4\7\52\0\25\6\33\0\27\6\11\0\3\7\65\6\17\7\37\0"+ - "\13\7\2\6\2\7\1\6\11\0\4\7\55\6\13\7\2\0\1\7"+ - "\4\0\1\7\12\0\1\7\2\0\31\6\7\0\12\7\6\0\3\7"+ - "\44\6\16\7\1\0\12\7\4\0\1\6\2\7\1\6\10\0\43\6"+ - "\1\7\2\0\1\6\11\0\3\7\60\6\16\7\4\6\4\0\4\7"+ - "\1\0\14\7\1\6\1\0\1\6\43\0\22\6\1\0\31\6\14\7"+ - "\6\0\1\7\101\0\7\6\1\0\1\6\1\0\4\6\1\0\17\6"+ - "\1\0\12\6\7\0\57\6\14\7\5\0\12\7\6\0\4\7\1\0"+ - "\10\6\2\0\2\6\2\0\26\6\1\0\7\6\1\0\2\6\1\0"+ - "\5\6\1\0\2\7\1\6\7\7\2\0\2\7\2\0\3\7\2\0"+ - "\1\6\6\0\1\7\5\0\5\6\2\7\2\0\7\7\3\0\5\7"+ - "\213\0\65\6\22\7\4\6\5\0\12\7\4\0\1\7\3\6\36\0"+ - "\60\6\24\7\2\6\1\0\1\6\10\0\12\7\246\0\57\6\7\7"+ - "\2\0\11\7\27\0\4\6\2\7\42\0\60\6\21\7\3\0\1\6"+ - "\13\0\12\7\46\0\53\6\15\7\1\6\7\0\12\7\66\0\33\6"+ - "\2\0\17\7\4\0\12\7\6\0\7\6\271\0\54\6\17\7\145\0"+ - "\100\6\12\7\25\0\10\6\2\0\1\6\2\0\10\6\1\0\2\6"+ - "\1\0\30\6\6\7\1\0\2\7\2\0\4\7\1\6\1\7\1\6"+ - "\2\7\14\0\12\7\106\0\10\6\2\0\47\6\7\7\2\0\7\7"+ - "\1\6\1\0\1\6\1\7\33\0\1\6\12\7\50\6\7\7\1\6"+ - "\4\7\10\0\1\7\10\0\1\6\13\7\56\6\20\7\3\0\1\6"+ - "\22\0\111\6\u0107\0\11\6\1\0\45\6\10\7\1\0\10\7\1\6"+ - "\17\0\12\7\30\0\36\6\2\0\26\7\1\0\16\7\111\0\7\6"+ - "\1\0\2\6\1\0\46\6\6\7\3\0\1\7\1\0\2\7\1\0"+ - "\7\7\1\6\1\7\10\0\12\7\6\0\6\6\1\0\2\6\1\0"+ - "\40\6\5\7\1\0\2\7\1\0\5\7\1\6\7\0\12\7\u0136\0"+ - "\23\6\4\7\271\0\1\6\54\0\4\6\37\0\u039a\6\146\0\157\6"+ - "\21\0\304\6\u0a4c\0\141\6\17\0\u042f\6\1\0\11\7\u0fc7\0\u0247\6"+ - "\u21b9\0\u0239\6\7\0\37\6\1\0\12\7\6\0\117\6\1\0\12\7"+ - "\6\0\36\6\2\0\5\7\13\0\60\6\7\7\11\0\4\6\14\0"+ - "\12\7\11\0\25\6\5\0\23\6\u02b0\0\100\6\200\0\113\6\4\0"+ - "\1\7\1\6\67\7\7\0\4\7\15\6\100\0\2\6\1\0\1\6"+ - "\1\7\13\0\2\7\16\0\u17f8\6\10\0\u04d6\6\52\0\11\6\u22e7\0"+ - "\4\6\1\0\7\6\1\0\2\6\1\0\u0123\6\55\0\3\6\21\0"+ - "\4\6\10\0\u018c\6\u0904\0\153\6\5\0\15\6\3\0\11\6\7\0"+ - "\12\6\3\0\2\7\1\0\4\7\u125c\0\56\7\2\0\27\7\u021e\0"+ - "\5\7\3\0\26\7\2\0\7\7\36\0\4\7\224\0\3\7\u01bb\0"+ - "\125\6\1\0\107\6\1\0\2\6\2\0\1\6\2\0\2\6\2\0"+ - "\4\6\1\0\14\6\1\0\1\6\1\0\7\6\1\0\101\6\1\0"+ - "\4\6\2\0\10\6\1\0\7\6\1\0\34\6\1\0\4\6\1\0"+ - "\5\6\1\0\1\6\3\0\7\6\1\0\u0154\6\2\0\31\6\1\0"+ - "\31\6\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0"+ - "\37\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0\10\6\2\0"+ - "\62\7\u0200\0\67\7\4\0\62\7\10\0\1\7\16\0\1\7\26\0"+ - "\5\7\1\0\17\7\u0450\0\37\6\341\0\7\7\1\0\21\7\2\0"+ - "\7\7\1\0\2\7\1\0\5\7\325\0\55\6\3\0\7\7\7\6"+ - "\2\0\12\7\4\0\1\6\u0141\0\36\6\1\7\21\0\54\6\16\7"+ - "\5\0\1\6\u04e0\0\7\6\1\0\4\6\1\0\2\6\1\0\17\6"+ + "\6\0\2\6\1\0\2\6\2\7\2\0\12\7\1\0\2\6\1\7"+ + "\14\0\4\7\11\6\1\0\3\6\1\0\51\6\2\7\1\6\7\7"+ + "\1\0\3\7\1\0\4\7\1\6\5\0\3\6\1\7\7\0\3\6"+ + "\2\7\2\0\12\7\12\0\6\6\1\0\3\7\1\0\22\6\3\0"+ + "\30\6\1\0\11\6\1\0\1\6\2\0\7\6\3\0\1\7\4\0"+ + "\6\7\1\0\1\7\1\0\10\7\6\0\12\7\2\0\2\7\15\0"+ + "\60\6\1\7\2\6\7\7\4\0\10\6\10\7\1\0\12\7\47\0"+ + "\2\6\1\0\1\6\1\0\5\6\1\0\30\6\1\0\1\6\1\0"+ + "\12\6\1\7\2\6\11\7\1\6\2\0\5\6\1\0\1\6\1\0"+ + "\7\7\1\0\12\7\2\0\4\6\40\0\1\6\27\0\2\7\6\0"+ + "\12\7\13\0\1\7\1\0\1\7\1\0\1\7\4\0\2\7\10\6"+ + "\1\0\44\6\4\0\24\7\1\0\2\7\5\6\13\7\1\0\44\7"+ + "\11\0\1\7\71\0\53\6\24\7\1\6\12\7\6\0\6\6\4\7"+ + "\4\6\3\7\1\6\3\7\2\6\7\7\3\6\4\7\15\6\14\7"+ + "\1\6\17\7\2\0\46\6\1\0\1\6\5\0\1\6\2\0\53\6"+ + "\1\0\u014d\6\1\0\4\6\2\0\7\6\1\0\1\6\1\0\4\6"+ + "\2\0\51\6\1\0\4\6\2\0\41\6\1\0\4\6\2\0\7\6"+ + "\1\0\1\6\1\0\4\6\2\0\17\6\1\0\71\6\1\0\4\6"+ + "\2\0\103\6\2\0\3\7\40\0\20\6\20\0\126\6\2\0\6\6"+ + "\3\0\u026c\6\2\0\21\6\1\0\32\6\5\0\113\6\3\0\13\6"+ + "\7\0\22\6\4\7\11\0\23\6\3\7\13\0\22\6\2\7\14\0"+ + "\15\6\1\0\3\6\1\0\2\7\14\0\64\6\40\7\3\0\1\6"+ + "\3\0\2\6\1\7\2\0\12\7\41\0\17\7\6\0\131\6\7\0"+ + "\5\6\2\7\42\6\1\7\1\6\5\0\106\6\12\0\37\6\1\0"+ + "\14\7\4\0\14\7\12\0\12\7\36\6\2\0\5\6\13\0\54\6"+ + "\4\0\32\6\6\0\12\7\46\0\27\6\5\7\4\0\65\6\12\7"+ + "\1\0\35\7\2\0\13\7\6\0\12\7\15\0\1\6\10\0\16\7"+ + "\1\0\20\7\61\0\5\7\57\6\21\7\10\6\3\0\12\7\21\0"+ + "\11\7\14\0\3\7\36\6\15\7\2\6\12\7\54\6\16\7\14\0"+ + "\44\6\24\7\10\0\12\7\3\0\3\6\12\7\44\6\2\0\11\6"+ + "\7\0\53\6\2\0\3\6\20\0\3\7\1\0\25\7\4\6\1\7"+ + "\6\6\1\7\2\6\3\7\1\6\5\0\300\6\100\7\u0116\6\2\0"+ + "\6\6\2\0\46\6\2\0\6\6\2\0\10\6\1\0\1\6\1\0"+ + "\1\6\1\0\1\6\1\0\37\6\2\0\65\6\1\0\7\6\1\0"+ + "\1\6\3\0\3\6\1\0\7\6\3\0\4\6\2\0\6\6\4\0"+ + "\15\6\5\0\3\6\1\0\7\6\16\0\5\7\30\0\1\126\1\126"+ + "\5\7\20\0\2\6\23\0\1\6\13\0\5\7\1\0\12\7\1\0"+ + "\1\6\15\0\1\6\20\0\15\6\3\0\41\6\17\0\15\7\4\0"+ + "\1\7\3\0\14\7\21\0\1\6\4\0\1\6\2\0\12\6\1\0"+ + "\1\6\3\0\5\6\6\0\1\6\1\0\1\6\1\0\1\6\1\0"+ + "\4\6\1\0\13\6\2\0\4\6\5\0\5\6\4\0\1\6\21\0"+ + "\51\6\u0a77\0\345\6\6\0\4\6\3\7\2\6\14\0\46\6\1\0"+ + "\1\6\5\0\1\6\2\0\70\6\7\0\1\6\17\0\1\7\27\6"+ + "\11\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6\1\0\7\6"+ + "\1\0\7\6\1\0\7\6\1\0\7\6\1\0\40\7\57\0\1\6"+ + "\u01d5\0\3\6\31\0\11\6\6\7\1\0\5\6\2\0\5\6\4\0"+ + "\126\6\2\0\2\7\2\0\3\6\1\0\132\6\1\0\4\6\5\0"+ + "\53\6\1\0\136\6\21\0\40\6\60\0\20\6\u0200\0\u19c0\6\100\0"+ + "\u568d\6\103\0\56\6\2\0\u010d\6\3\0\20\6\12\7\2\6\24\0"+ + "\57\6\1\7\4\0\12\7\1\0\37\6\2\7\120\6\2\7\45\0"+ + "\11\6\2\0\147\6\2\0\100\6\5\0\2\6\1\0\1\6\1\0"+ + "\5\6\30\0\20\6\1\7\3\6\1\7\4\6\1\7\27\6\5\7"+ + "\4\0\1\7\13\0\1\6\7\0\64\6\14\0\2\7\62\6\22\7"+ + "\12\0\12\7\6\0\22\7\6\6\3\0\1\6\1\0\2\6\13\7"+ + "\34\6\10\7\2\0\27\6\15\7\14\0\35\6\3\0\4\7\57\6"+ + "\16\7\16\0\1\6\12\7\6\0\5\6\1\7\12\6\12\7\5\6"+ + "\1\0\51\6\16\7\11\0\3\6\1\7\10\6\2\7\2\0\12\7"+ + "\6\0\27\6\3\0\1\6\3\7\62\6\1\7\1\6\3\7\2\6"+ + "\2\7\5\6\2\7\1\6\1\7\1\6\30\0\3\6\2\0\13\6"+ + "\5\7\2\0\3\6\2\7\12\0\6\6\2\0\6\6\2\0\6\6"+ + "\11\0\7\6\1\0\7\6\1\0\53\6\1\0\16\6\6\0\163\6"+ + "\10\7\1\0\2\7\2\0\12\7\6\0\u2ba4\6\14\0\27\6\4\0"+ + "\61\6\u2104\0\u016e\6\2\0\152\6\46\0\7\6\14\0\5\6\5\0"+ + "\1\6\1\7\12\6\1\0\15\6\1\0\5\6\1\0\1\6\1\0"+ + "\2\6\1\0\2\6\1\0\154\6\41\0\u016b\6\22\0\100\6\2\0"+ + "\66\6\50\0\15\6\3\0\20\7\20\0\20\7\3\0\2\6\30\0"+ + "\3\6\31\0\1\6\6\0\5\6\1\0\207\6\2\0\1\7\4\0"+ + "\1\6\13\0\12\7\7\0\32\6\4\0\1\6\1\0\32\6\13\0"+ + "\131\6\3\0\6\6\2\0\6\6\2\0\6\6\2\0\3\6\3\0"+ + "\2\6\3\0\2\6\22\0\3\7\4\0\14\6\1\0\32\6\1\0"+ + "\23\6\1\0\2\6\1\0\17\6\2\0\16\6\42\0\173\6\105\0"+ + "\65\6\210\0\1\7\202\0\35\6\3\0\61\6\17\0\1\7\37\0"+ + "\40\6\15\0\36\6\5\0\46\6\5\7\5\0\36\6\2\0\44\6"+ + "\4\0\10\6\1\0\5\6\52\0\236\6\2\0\12\7\6\0\44\6"+ + "\4\0\44\6\4\0\50\6\10\0\64\6\14\0\13\6\1\0\17\6"+ + "\1\0\7\6\1\0\2\6\1\0\13\6\1\0\17\6\1\0\7\6"+ + "\1\0\2\6\103\0\u0137\6\11\0\26\6\12\0\10\6\30\0\6\6"+ + "\1\0\52\6\1\0\11\6\105\0\6\6\2\0\1\6\1\0\54\6"+ + "\1\0\2\6\3\0\1\6\2\0\27\6\12\0\27\6\11\0\37\6"+ + "\101\0\23\6\1\0\2\6\12\0\26\6\12\0\32\6\106\0\70\6"+ + "\6\0\2\6\100\0\1\6\3\7\1\0\2\7\5\0\4\7\4\6"+ + "\1\0\3\6\1\0\35\6\2\0\3\7\4\0\1\7\40\0\35\6"+ + "\3\0\35\6\43\0\10\6\1\0\34\6\2\7\31\0\66\6\12\0"+ + "\26\6\12\0\23\6\15\0\22\6\156\0\111\6\67\0\63\6\15\0"+ + "\63\6\15\0\44\6\4\7\10\0\12\7\u0146\0\52\6\1\0\2\7"+ + "\3\0\2\6\113\0\3\7\35\6\12\0\1\6\10\0\26\6\13\7"+ + "\37\0\22\6\4\7\52\0\25\6\33\0\27\6\11\0\3\7\65\6"+ + "\17\7\37\0\13\7\2\6\2\7\1\6\11\0\4\7\55\6\13\7"+ + "\2\0\1\7\4\0\1\7\12\0\1\7\2\0\31\6\7\0\12\7"+ + "\6\0\3\7\44\6\16\7\1\0\12\7\4\0\1\6\2\7\1\6"+ + "\10\0\43\6\1\7\2\0\1\6\11\0\3\7\60\6\16\7\4\6"+ + "\4\0\4\7\1\0\14\7\1\6\1\0\1\6\43\0\22\6\1\0"+ + "\31\6\14\7\6\0\1\7\2\6\1\7\76\0\7\6\1\0\1\6"+ + "\1\0\4\6\1\0\17\6\1\0\12\6\7\0\57\6\14\7\5\0"+ + "\12\7\6\0\4\7\1\0\10\6\2\0\2\6\2\0\26\6\1\0"+ + "\7\6\1\0\2\6\1\0\5\6\1\0\2\7\1\6\7\7\2\0"+ + "\2\7\2\0\3\7\2\0\1\6\6\0\1\7\5\0\5\6\2\7"+ + "\2\0\7\7\3\0\5\7\213\0\65\6\22\7\4\6\5\0\12\7"+ + "\4\0\1\7\3\6\36\0\60\6\24\7\2\6\1\0\1\6\10\0"+ + "\12\7\246\0\57\6\7\7\2\0\11\7\27\0\4\6\2\7\42\0"+ + "\60\6\21\7\3\0\1\6\13\0\12\7\46\0\53\6\15\7\1\6"+ + "\7\0\12\7\66\0\33\6\2\0\17\7\4\0\12\7\6\0\7\6"+ + "\271\0\54\6\17\7\145\0\100\6\12\7\25\0\10\6\2\0\1\6"+ + "\2\0\10\6\1\0\2\6\1\0\30\6\6\7\1\0\2\7\2\0"+ + "\4\7\1\6\1\7\1\6\2\7\14\0\12\7\106\0\10\6\2\0"+ + "\47\6\7\7\2\0\7\7\1\6\1\0\1\6\1\7\33\0\1\6"+ + "\12\7\50\6\7\7\1\6\4\7\10\0\1\7\10\0\1\6\13\7"+ + "\56\6\20\7\3\0\1\6\22\0\111\6\u0107\0\11\6\1\0\45\6"+ + "\10\7\1\0\10\7\1\6\17\0\12\7\30\0\36\6\2\0\26\7"+ + "\1\0\16\7\111\0\7\6\1\0\2\6\1\0\46\6\6\7\3\0"+ + "\1\7\1\0\2\7\1\0\7\7\1\6\1\7\10\0\12\7\6\0"+ + "\6\6\1\0\2\6\1\0\40\6\5\7\1\0\2\7\1\0\5\7"+ + "\1\6\7\0\12\7\u0136\0\23\6\4\7\11\0\2\7\1\6\1\7"+ + "\15\6\1\0\42\6\7\7\3\0\5\7\15\0\12\7\126\0\1\6"+ + "\54\0\4\6\37\0\u039a\6\146\0\157\6\21\0\304\6\u0a4c\0\141\6"+ + "\17\0\u0430\6\21\7\6\6\17\7\u0faa\0\u0247\6\u21b9\0\u0239\6\7\0"+ + "\37\6\1\0\12\7\6\0\117\6\1\0\12\7\6\0\36\6\2\0"+ + "\5\7\13\0\60\6\7\7\11\0\4\6\14\0\12\7\11\0\25\6"+ + "\5\0\23\6\u02b0\0\100\6\200\0\113\6\4\0\1\7\1\6\67\7"+ + "\7\0\4\7\15\6\100\0\2\6\1\0\1\6\1\7\13\0\2\7"+ + "\16\0\u17f8\6\10\0\u04d6\6\52\0\11\6\u22e7\0\4\6\1\0\7\6"+ + "\1\0\2\6\1\0\u0123\6\17\0\1\6\35\0\3\6\2\0\1\6"+ + "\16\0\4\6\10\0\u018c\6\u0904\0\153\6\5\0\15\6\3\0\11\6"+ + "\7\0\12\6\3\0\2\7\1\0\4\7\u125c\0\56\7\2\0\27\7"+ + "\u021e\0\5\7\3\0\26\7\2\0\7\7\36\0\4\7\224\0\3\7"+ + "\u01bb\0\125\6\1\0\107\6\1\0\2\6\2\0\1\6\2\0\2\6"+ + "\2\0\4\6\1\0\14\6\1\0\1\6\1\0\7\6\1\0\101\6"+ + "\1\0\4\6\2\0\10\6\1\0\7\6\1\0\34\6\1\0\4\6"+ + "\1\0\5\6\1\0\1\6\3\0\7\6\1\0\u0154\6\2\0\31\6"+ + "\1\0\31\6\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6"+ + "\1\0\37\6\1\0\31\6\1\0\37\6\1\0\31\6\1\0\10\6"+ + "\2\0\62\7\u0200\0\67\7\4\0\62\7\10\0\1\7\16\0\1\7"+ + "\26\0\5\7\1\0\17\7\u0450\0\37\6\6\0\6\6\325\0\7\7"+ + "\1\0\21\7\2\0\7\7\1\0\2\7\1\0\5\7\5\0\76\6"+ + "\41\0\1\7\160\0\55\6\3\0\7\7\7\6\2\0\12\7\4\0"+ + "\1\6\u0141\0\36\6\1\7\21\0\54\6\16\7\5\0\1\6\u01d0\0"+ + "\34\6\16\7\u02e6\0\7\6\1\0\4\6\1\0\2\6\1\0\17\6"+ "\1\0\305\6\13\0\7\7\51\0\104\6\7\7\1\6\4\0\12\7"+ "\u0356\0\1\6\u014f\0\4\6\1\0\33\6\1\0\2\6\1\0\1\6"+ "\2\0\1\6\1\0\12\6\1\0\4\6\1\0\1\6\1\0\1\6"+ @@ -246,8 +251,8 @@ public final class ActionScriptLexer { "\1\0\1\6\1\0\1\6\1\0\2\6\1\0\1\6\2\0\4\6"+ "\1\0\7\6\1\0\4\6\1\0\4\6\1\0\1\6\1\0\12\6"+ "\1\0\21\6\5\0\3\6\1\0\5\6\1\0\21\6\u0d34\0\12\7"+ - "\u0406\0\ua6e0\6\40\0\u1039\6\7\0\336\6\2\0\u1682\6\16\0\u1d31\6"+ - "\u0c1f\0\u021e\6\u05e2\0\u134b\6\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uecc0\0"+ + "\u0406\0\ua6e0\6\40\0\u103a\6\6\0\336\6\2\0\u1682\6\16\0\u1d31\6"+ + "\17\0\u026e\6\u09a2\0\u021e\6\u05e2\0\u134b\6\5\0\u1060\6\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\udc5b\0"+ "\1\7\36\0\140\7\200\0\360\7\uffff\0\uffff\0\ufe12\0"; /** @@ -1224,6 +1229,8 @@ public final class ActionScriptLexer { private int repeatNum = 1; + private int itemStart = -1; + private boolean caseSensitiveIdentifiers = false; public static final int SWF_VERSION_CASE_SENSITIVE = 7; @@ -1308,7 +1315,7 @@ public final class ActionScriptLexer { char [] map = new char[0x110000]; int i = 0; /* index in packed string */ int j = 0; /* index in unpacked array */ - while (i < 3866) { + while (i < 3934) { int count = packed.charAt(i++); char value = packed.charAt(i++); do map[j++] = value; while (--count > 0); @@ -1611,131 +1618,134 @@ public final class ActionScriptLexer { } case 183: break; case 4: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DIVIDE, yytext()); } case 184: break; case 5: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.MULTIPLY, yytext()); } case 185: break; case 6: - { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); } case 186: break; case 7: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DOT, yytext()); } case 187: break; case 8: { try{ - return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext())); + return new ParsedSymbol(yychar(), SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext())); } catch(NumberFormatException nfe){ //its too long for a Long var - return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); + return new ParsedSymbol(yychar(), SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); } } case 188: break; case 9: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.MINUS, yytext()); } case 189: break; case 10: - { string.setLength(0); + { itemStart = yychar(); + string.setLength(0); yybegin(STRING); } case 190: break; case 11: - { string.setLength(0); + { itemStart = yychar(); + string.setLength(0); yybegin(CHARLITERAL); } case 191: break; case 12: - { string.setLength(0); + { itemStart = yychar(); + string.setLength(0); yybegin(OIDENTIFIER); } case 192: break; case 13: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.PARENT_OPEN, yytext()); } case 193: break; case 14: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.PARENT_CLOSE, yytext()); } case 194: break; case 15: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.CURLY_OPEN, yytext()); } case 195: break; case 16: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.CURLY_CLOSE, yytext()); } case 196: break; case 17: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BRACKET_OPEN, yytext()); } case 197: break; case 18: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BRACKET_CLOSE, yytext()); } case 198: break; case 19: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.SEMICOLON, yytext()); } case 199: break; case 20: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.COMMA, yytext()); } case 200: break; case 21: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN, yytext()); } case 201: break; case 22: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.GREATER_THAN, yytext()); } case 202: break; case 23: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.LOWER_THAN, yytext()); } case 203: break; case 24: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NOT, yytext()); } case 204: break; case 25: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NEGATE, yytext()); } case 205: break; case 26: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.TERNAR, yytext()); } case 206: break; case 27: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.COLON, yytext()); } case 207: break; case 28: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BITAND, yytext()); } case 208: break; case 29: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.BITOR, yytext()); } case 209: break; case 30: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.PLUS, yytext()); } case 210: break; case 31: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.XOR, yytext()); } case 211: break; case 32: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.MODULO, yytext()); } case 212: break; case 33: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ATTRIBUTE, yytext()); } case 213: break; case 34: @@ -1749,7 +1759,7 @@ public final class ActionScriptLexer { case 36: { yybegin(YYINITIAL); // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString()); + return new ParsedSymbol(itemStart, SymbolGroup.STRING, SymbolType.STRING, string.toString()); } case 216: break; case 37: @@ -1760,7 +1770,7 @@ public final class ActionScriptLexer { { yybegin(YYINITIAL); repeatNum = 1; // length also includes the trailing quote - return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); + return new ParsedSymbol(itemStart, SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString()); } case 218: break; case 39: @@ -1768,103 +1778,103 @@ public final class ActionScriptLexer { } case 219: break; case 40: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_DIVIDE, yytext()); } case 220: break; case 41: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_MULTIPLY, yytext()); } case 221: break; case 42: - { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); + { return new ParsedSymbol(yychar(), SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble(yytext())); } case 222: break; case 43: - { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); + { return new ParsedSymbol(yychar(), SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); } case 223: break; case 44: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DECREMENT, yytext()); } case 224: break; case 45: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_MINUS, yytext()); } case 225: break; case 46: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.FULLOR, yytext()); } case 226: break; case 47: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IN, yytext()); } case 227: break; case 48: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IF, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IF, yytext()); } case 228: break; case 49: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DO, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.DO, yytext()); } case 229: break; case 50: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.EQUALS, yytext()); } case 230: break; case 51: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.GREATER_EQUAL, yytext()); } case 231: break; case 52: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.SHIFT_RIGHT, yytext()); } case 232: break; case 53: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.LOWER_EQUAL, yytext()); } case 233: break; case 54: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NOT_EQUAL, yytext()); } case 234: break; case 55: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.SHIFT_LEFT, yytext()); } case 235: break; case 56: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITAND, yytext()); } case 236: break; case 57: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AND, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.AND, yytext()); } case 237: break; case 58: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_BITOR, yytext()); } case 238: break; case 59: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.OR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.OR, yytext()); } case 239: break; case 60: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_PLUS, yytext()); } case 240: break; case 61: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.INCREMENT, yytext()); } case 241: break; case 62: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_XOR, yytext()); } case 242: break; case 63: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_MODULO, yytext()); } case 243: break; case 64: - { return new ParsedSymbol(SymbolGroup.DIRECTIVE, SymbolType.DIRECTIVE, yytext().substring(1)); + { return new ParsedSymbol(yychar(), SymbolGroup.DIRECTIVE, SymbolType.DIRECTIVE, yytext().substring(1)); } case 244: break; case 65: @@ -1936,134 +1946,134 @@ public final class ActionScriptLexer { } case 261: break; case 82: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.REST, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.REST, yytext()); } case 262: break; case 83: - { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); + { return new ParsedSymbol(yychar(), SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); } case 263: break; case 84: - { return new ParsedSymbol(SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); + { return new ParsedSymbol(yychar(), SymbolGroup.PREPROCESSOR, SymbolType.PREPROCESSOR, yytext().substring(2)); } case 264: break; case 85: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.FULLAND, yytext()); } case 265: break; case 86: - { if (caseSensitiveIdentifiers && !"chr".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); + { if (caseSensitiveIdentifiers && !"chr".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); } case 266: break; case 87: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SET, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.SET, yytext()); } case 267: break; case 88: - { if (caseSensitiveIdentifiers && !"ord".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); + { if (caseSensitiveIdentifiers && !"ord".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); } case 268: break; case 89: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.NEW, yytext()); } case 269: break; case 90: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.TRY, yytext()); } case 270: break; case 91: - { if (caseSensitiveIdentifiers && !"int".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); + { if (caseSensitiveIdentifiers && !"int".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); } case 271: break; case 92: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FOR, yytext()); } case 272: break; case 93: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); } case 273: break; case 94: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.GET, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.GET, yytext()); } case 274: break; case 95: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.STRICT_EQUALS, yytext()); } case 275: break; case 96: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_RIGHT, yytext()); } case 276: break; case 97: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.USHIFT_RIGHT, yytext()); } case 277: break; case 98: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_SHIFT_LEFT, yytext()); } case 278: break; case 99: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.STRICT_NOT_EQUAL, yytext()); } case 279: break; case 100: - { if (caseSensitiveIdentifiers && !"eval".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); + { if (caseSensitiveIdentifiers && !"eval".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); } case 280: break; case 101: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EACH, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.EACH, yytext()); } case 281: break; case 102: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.ELSE, yytext()); } case 282: break; case 103: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CASE, yytext()); } case 283: break; case 104: - { if (caseSensitiveIdentifiers && !"call".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); + { if (caseSensitiveIdentifiers && !"call".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); } case 284: break; case 105: - { if (caseSensitiveIdentifiers && !"stop".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); + { if (caseSensitiveIdentifiers && !"stop".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); } case 285: break; case 106: - { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.GLOBALCONST, SymbolType.NULL, yytext()); } case 286: break; case 107: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.TRUE, yytext()); } case 287: break; case 108: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.THIS, yytext()); } case 288: break; case 109: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.WITH, yytext()); } case 289: break; case 110: - { if (caseSensitiveIdentifiers && !"play".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); + { if (caseSensitiveIdentifiers && !"play".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); } case 290: break; case 111: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.VOID, yytext()); } case 291: break; case 112: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.ASSIGN_USHIFT_RIGHT, yytext()); } case 292: break; case 113: @@ -2086,306 +2096,306 @@ public final class ActionScriptLexer { } case 296: break; case 117: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.BREAK, yytext()); } case 297: break; case 118: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CATCH, yytext()); } case 298: break; case 119: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); } case 299: break; case 120: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.SUPER, yytext()); } case 300: break; case 121: - { if (caseSensitiveIdentifiers && !"trace".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); + { if (caseSensitiveIdentifiers && !"trace".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); } case 301: break; case 122: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.THROW, yytext()); } case 302: break; case 123: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FALSE, yytext()); } case 303: break; case 124: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.WHILE, yytext()); } case 304: break; case 125: - { if (caseSensitiveIdentifiers && !"print".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); + { if (caseSensitiveIdentifiers && !"print".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); } case 305: break; case 126: - { if (caseSensitiveIdentifiers && !"mbchr".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); + { if (caseSensitiveIdentifiers && !"mbchr".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); } case 306: break; case 127: - { if (caseSensitiveIdentifiers && !"mbord".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); + { if (caseSensitiveIdentifiers && !"mbord".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); } case 307: break; case 128: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.RETURN, yytext()); } case 308: break; case 129: - { if (caseSensitiveIdentifiers && !"random".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); + { if (caseSensitiveIdentifiers && !"random".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); } case 309: break; case 130: - { if (caseSensitiveIdentifiers && !"String".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); + { if (caseSensitiveIdentifiers && !"String".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); } case 310: break; case 131: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.STATIC, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.STATIC, yytext()); } case 311: break; case 132: - { if (caseSensitiveIdentifiers && !"substr".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); + { if (caseSensitiveIdentifiers && !"substr".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); } case 312: break; case 133: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.SWITCH, yytext()); } case 313: break; case 134: - { if (caseSensitiveIdentifiers && !"Number".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); + { if (caseSensitiveIdentifiers && !"Number".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); } case 314: break; case 135: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.TYPEOF, yytext()); } case 315: break; case 136: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); } case 316: break; case 137: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); } case 317: break; case 138: - { if (caseSensitiveIdentifiers && !"length".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); + { if (caseSensitiveIdentifiers && !"length".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); } case 318: break; case 139: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); } case 319: break; case 140: - { if (caseSensitiveIdentifiers && !"getURL".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); + { if (caseSensitiveIdentifiers && !"getURL".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); } case 320: break; case 141: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); } case 321: break; case 142: - { if (caseSensitiveIdentifiers && !"newline".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); + { if (caseSensitiveIdentifiers && !"newline".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); } case 322: break; case 143: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.DEFAULT, yytext()); } case 323: break; case 144: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.DYNAMIC, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.DYNAMIC, yytext()); } case 324: break; case 145: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FINALLY, yytext()); } case 325: break; case 146: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); } case 326: break; case 147: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.CONTINUE, yytext()); } case 327: break; case 148: - { if (caseSensitiveIdentifiers && !"stopDrag".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); + { if (caseSensitiveIdentifiers && !"stopDrag".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); } case 328: break; case 149: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); } case 329: break; case 150: - { if (caseSensitiveIdentifiers && !"printNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); + { if (caseSensitiveIdentifiers && !"printNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); } case 330: break; case 151: - { if (caseSensitiveIdentifiers && !"mblength".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); + { if (caseSensitiveIdentifiers && !"mblength".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); } case 331: break; case 152: - { if (caseSensitiveIdentifiers && !"getTimer".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); + { if (caseSensitiveIdentifiers && !"getTimer".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); } case 332: break; case 153: - { if (caseSensitiveIdentifiers && !"startDrag".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); + { if (caseSensitiveIdentifiers && !"startDrag".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); } case 333: break; case 154: - { if (caseSensitiveIdentifiers && !"nextFrame".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); + { if (caseSensitiveIdentifiers && !"nextFrame".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); } case 334: break; case 155: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); } case 335: break; case 156: - { if (caseSensitiveIdentifiers && !"undefined".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); + { if (caseSensitiveIdentifiers && !"undefined".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); } case 336: break; case 157: - { if (caseSensitiveIdentifiers && !"fscommand".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); + { if (caseSensitiveIdentifiers && !"fscommand".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND, yytext()); } case 337: break; case 158: - { if (caseSensitiveIdentifiers && !"loadMovie".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); + { if (caseSensitiveIdentifiers && !"loadMovie".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); } case 338: break; case 159: - { if (caseSensitiveIdentifiers && !"prevFrame".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); + { if (caseSensitiveIdentifiers && !"prevFrame".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); } case 339: break; case 160: - { if (caseSensitiveIdentifiers && !"tellTarget".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); + { if (caseSensitiveIdentifiers && !"tellTarget".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); } case 340: break; case 161: - { if (caseSensitiveIdentifiers && !"targetPath".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); + { if (caseSensitiveIdentifiers && !"targetPath".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); } case 341: break; case 162: - { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); } case 342: break; case 163: - { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); + { return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); } case 343: break; case 164: - { if (caseSensitiveIdentifiers && !"fscommand2".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND2, yytext()); + { if (caseSensitiveIdentifiers && !"fscommand2".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.FSCOMMAND2, yytext()); } case 344: break; case 165: - { if (caseSensitiveIdentifiers && !"getVersion".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); + { if (caseSensitiveIdentifiers && !"getVersion".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); } case 345: break; case 166: - { if (caseSensitiveIdentifiers && !"unloadMovie".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); + { if (caseSensitiveIdentifiers && !"unloadMovie".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); } case 346: break; case 167: - { if (caseSensitiveIdentifiers && !"mbsubstring".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); + { if (caseSensitiveIdentifiers && !"mbsubstring".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); } case 347: break; case 168: - { if (caseSensitiveIdentifiers && !"gotoAndStop".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); + { if (caseSensitiveIdentifiers && !"gotoAndStop".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); } case 348: break; case 169: - { if (caseSensitiveIdentifiers && !"gotoAndPlay".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); + { if (caseSensitiveIdentifiers && !"gotoAndPlay".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); } case 349: break; case 170: - { if (caseSensitiveIdentifiers && !"loadMovieNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); + { if (caseSensitiveIdentifiers && !"loadMovieNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); } case 350: break; case 171: - { if (caseSensitiveIdentifiers && !"stopAllSounds".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); + { if (caseSensitiveIdentifiers && !"stopAllSounds".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); } case 351: break; case 172: - { if (caseSensitiveIdentifiers && !"ifFrameLoaded".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); + { if (caseSensitiveIdentifiers && !"ifFrameLoaded".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); } case 352: break; case 173: - { if (caseSensitiveIdentifiers && !"loadVariables".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); + { if (caseSensitiveIdentifiers && !"loadVariables".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); } case 353: break; case 174: - { if (caseSensitiveIdentifiers && !"printAsBitmap".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); + { if (caseSensitiveIdentifiers && !"printAsBitmap".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); } case 354: break; case 175: - { if (caseSensitiveIdentifiers && !"unloadMovieNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); + { if (caseSensitiveIdentifiers && !"unloadMovieNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); } case 355: break; case 176: - { if (caseSensitiveIdentifiers && !"removeMovieClip".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); + { if (caseSensitiveIdentifiers && !"removeMovieClip".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); } case 356: break; case 177: - { if (caseSensitiveIdentifiers && !"loadVariablesNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); + { if (caseSensitiveIdentifiers && !"loadVariablesNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); } case 357: break; case 178: - { if (caseSensitiveIdentifiers && !"printAsBitmapNum".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); + { if (caseSensitiveIdentifiers && !"printAsBitmapNum".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); } case 358: break; case 179: - { if (caseSensitiveIdentifiers && !"toggleHighQuality".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); + { if (caseSensitiveIdentifiers && !"toggleHighQuality".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); } case 359: break; case 180: - { if (caseSensitiveIdentifiers && !"duplicateMovieClip".equals(yytext())) return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); - return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); + { if (caseSensitiveIdentifiers && !"duplicateMovieClip".equals(yytext())) return new ParsedSymbol(yychar(), SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); + return new ParsedSymbol(yychar(), SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); } case 360: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; { - return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); + return new ParsedSymbol(yychar(), SymbolGroup.EOF, SymbolType.EOF, null); } } else { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ParsedSymbol.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ParsedSymbol.java index 681b7b010..f10eff678 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ParsedSymbol.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ParsedSymbol.java @@ -23,24 +23,31 @@ package com.jpexs.decompiler.flash.action.parser.script; */ public class ParsedSymbol { + /** + * Position (characters) in source text + */ + public int position; + public SymbolGroup group; public Object value; public SymbolType type; - public ParsedSymbol(SymbolGroup group, SymbolType type) { + public ParsedSymbol(int position, SymbolGroup group, SymbolType type) { + this.position = position; this.group = group; this.type = type; this.value = null; } - public ParsedSymbol(SymbolGroup group, SymbolType type, Object value) { + public ParsedSymbol(int position, SymbolGroup group, SymbolType type, Object value) { + this.position = position; this.group = group; this.type = type; this.value = value; - } - + } + @Override public String toString() { return group.toString() + " " + type.toString() + " " + (value != null ? value.toString() : ""); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/VariableActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/VariableActionItem.java index 06145b113..a25acd92d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/VariableActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/VariableActionItem.java @@ -18,7 +18,6 @@ package com.jpexs.decompiler.flash.action.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.model.ActionItem; -import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; @@ -42,6 +41,11 @@ public class VariableActionItem extends ActionItem { private GraphTargetItem storeValue; private boolean definition; + + /** + * Position in code + */ + private int position = -1; public void setDefinition(boolean definition) { this.definition = definition; @@ -61,6 +65,14 @@ public class VariableActionItem extends ActionItem { this.definition = definition; } + public void setPosition(int position) { + this.position = position; + } + + public int getPosition() { + return position; + } + public boolean isDefinition() { return definition; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index 9d07ad79a..4b0a6d80c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -226,7 +226,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta funcList.add((FunctionActionItem) val); } } - FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, 1, new ArrayList<>(), funcList, false /*actually unknown*/); + FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, 1, new ArrayList<>(), funcList, false /*actually unknown*/, new ArrayList<>(), null); //ActionGraph.translateViaGraph(regNames, variables, functions, code, version) stack.push(fti); functions.put(functionName, fti); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 4ec0cf25b..3325a76c1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -429,7 +429,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont funcList.add((FunctionActionItem) val); } } - FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, getFirstRegister(), new ArrayList<>(), funcList, false /*actually unknown*/); + FunctionActionItem fti = new FunctionActionItem(this, lineStartItem, functionName, paramNames, getRegNames(), content.get(0), constantPool, getFirstRegister(), new ArrayList<>(), funcList, false /*actually unknown*/, new ArrayList<>(), paramRegisters); functions.put(functionName, fti); stack.push(fti); } diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex index 62147b182..5d6150586 100644 --- a/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/jflex/jsyntaxpane/lexers/actionscript.flex @@ -103,8 +103,6 @@ SlashVariable = {Path} ":" {Identifier} /* identifiers */ -IdentifierNs = {Identifier} ":" {Identifier} - /* integer literals */ DecIntegerLiteral = 0 | [1-9][0-9]* @@ -295,8 +293,6 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]* {WhiteSpace} { } /* identifiers */ "#" {Identifier} { return token(TokenType.KEYWORD); } - {SlashVariable} { return token(TokenType.IDENTIFIER); } - {Identifier}{NamespaceSuffix} { return token(TokenType.REGEX); } {Identifier} { return token(TokenType.IDENTIFIER); } } diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 9df57bd3e..4773d8426 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -146,6 +146,7 @@ import java.util.logging.LogManager; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import java.util.regex.Pattern; +import javax.swing.JEditorPane; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.SwingWorker; @@ -2590,7 +2591,7 @@ public class Main { initUiLang(); initLookAndFeel(); - + View.execInEventDispatch(() -> { ErrorLogFrame.createNewInstance(); diff --git a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index f2bd6c35d..779b0222a 100644 --- a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -115,6 +115,7 @@ import javax.swing.text.Highlighter; import javax.swing.text.JTextComponent; import javax.swing.text.Utilities; import javax.swing.tree.TreePath; +import jsyntaxpane.DefaultSyntaxKit; import jsyntaxpane.SyntaxDocument; import jsyntaxpane.Token; import jsyntaxpane.TokenType; @@ -639,6 +640,7 @@ public class ActionPanel extends JPanel implements SearchListener. + */ +package com.jpexs.decompiler.flash.gui.action; + +import com.jpexs.decompiler.flash.SWF; +import com.jpexs.decompiler.flash.action.parser.ActionParseException; +import com.jpexs.decompiler.flash.action.parser.script.ActionScript2VariableParser; +import com.jpexs.decompiler.flash.gui.editor.DebuggableEditorPane; +import java.awt.Color; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.IOException; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Logger; +import javax.swing.JEditorPane; +import javax.swing.event.CaretEvent; +import javax.swing.event.CaretListener; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.BadLocationException; +import jsyntaxpane.SyntaxDocument; +import jsyntaxpane.Token; +import jsyntaxpane.TokenType; +import jsyntaxpane.actions.ActionUtils; +import jsyntaxpane.components.Markers; +import jsyntaxpane.components.SyntaxComponent; +import jsyntaxpane.util.Configuration; + +/** + * This class highlights Variable tokens of ActionScript 1/2 + */ +public class ActionVariableMarker implements SyntaxComponent, CaretListener, PropertyChangeListener, DocumentListener { + + public static final String DEFAULT_TOKENTYPES = "IDENTIFIER, REGEX"; + public static final String PROPERTY_COLOR = "TokenMarker.Color"; + public static final String PROPERTY_TOKENTYPES = "ActionVariableMarker.TokenTypes"; + private static final Color DEFAULT_COLOR = new Color(0xFFEE66); + private JEditorPane pane; + private final Set tokenTypes = new HashSet<>(); + private Markers.SimpleMarker marker; + private Status status; + + private Map> definitionPosToReferences = new LinkedHashMap<>(); + private Map referenceToDefinition = new LinkedHashMap<>(); + + /** + * Constructs a new Token highlighter + */ + public ActionVariableMarker() { + } + + @Override + public void caretUpdate(CaretEvent e) { + markTokenAt(e.getDot()); + } + + public void markTokenAt(int pos) { + SyntaxDocument doc = ActionUtils.getSyntaxDocument(pane); + if (doc != null) { + Token token = getIdentifierTokenAt(doc, pos); + removeMarkers(); + if (token != null && tokenTypes.contains(token.type)) { + addMarkers(token); + } + } + } + + /** + * removes all markers from the pane. + */ + public void removeMarkers() { + Markers.removeMarkers(pane, marker); + } + + private Token getIdentifierTokenAt(SyntaxDocument sDoc, int pos) { + Token thisToken = sDoc.getTokenAt(pos); + if (thisToken != null && (thisToken.type == TokenType.IDENTIFIER || thisToken.type == TokenType.REGEX)) { + return thisToken; + } + + Token token = sDoc.getTokenAt(pos - 1); + if (token != null && (token.type == TokenType.IDENTIFIER || token.type == TokenType.REGEX) && (token.start + token.length == pos)) { + return token; + } + + token = sDoc.getTokenAt(pos + 1); + if (token != null && (token.type == TokenType.IDENTIFIER || token.type == TokenType.REGEX)) { + return token; + } + return null; + } + + /** + * add highlights for the given pattern + * + * @param pattern + */ + void addMarkers(Token tok) { + SyntaxDocument sDoc = (SyntaxDocument) pane.getDocument(); + sDoc.readLock(); + int definitionPos = tok.start; + if (referenceToDefinition.containsKey(tok.start)) { + definitionPos = referenceToDefinition.get(tok.start); + } + Token definitionToken = getIdentifierTokenAt(sDoc, definitionPos); + if (definitionToken != null) { + if (definitionPosToReferences.containsKey(definitionPos)) { + Markers.markToken(pane, definitionToken, marker); + for (int i : definitionPosToReferences.get(definitionPos)) { + Token referenceToken = getIdentifierTokenAt(sDoc, i); + if (referenceToken != null) { + Markers.markToken(pane, referenceToken, marker); + } + } + } + } + sDoc.readUnlock(); + } + + @Override + public void config(Configuration config) { + Color markerColor = config.getColor( + PROPERTY_COLOR, DEFAULT_COLOR); + this.marker = new Markers.SimpleMarker(markerColor); + String types = config.getString( + PROPERTY_TOKENTYPES, DEFAULT_TOKENTYPES); + + for (String type : types.split("\\s*,\\s*")) { + try { + TokenType tt = TokenType.valueOf(type); + tokenTypes.add(tt); + } catch (IllegalArgumentException e) { + LOG.warning("Error in setting up TokenMarker " + + " - Invalid TokenType: " + type); + } + + } + } + + @Override + public void install(JEditorPane editor) { + this.pane = editor; + editor.addCaretListener(this); + editor.addPropertyChangeListener(this); + editor.getDocument().addDocumentListener(this); + documentUpdated(); + markTokenAt(editor.getCaretPosition()); + status = Status.INSTALLING; + } + + @Override + public void deinstall(JEditorPane editor) { + status = Status.DEINSTALLING; + removeMarkers(); + pane.removePropertyChangeListener(this); + pane.getDocument().removeDocumentListener(this); + pane.removeCaretListener(this); + } + + private static final Logger LOG = Logger.getLogger(ActionVariableMarker.class.getName()); + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (evt.getPropertyName().equals("document")) { + pane.removeCaretListener(this); + pane.getDocument().removeDocumentListener(this); + if (status.equals(Status.INSTALLING)) { + pane.addCaretListener(this); + pane.getDocument().addDocumentListener(this); + removeMarkers(); + documentUpdated(); + } + } + } + + private void documentUpdated() { + try { + SyntaxDocument sDoc = (SyntaxDocument) pane.getDocument(); + + String fullText = sDoc.getText(0, sDoc.getLength()); + + SWF swf = null; + if (pane instanceof DebuggableEditorPane) { + DebuggableEditorPane dpane = (DebuggableEditorPane) pane; + swf = dpane.getSwf(); + } + if (swf == null) { + return; + } + + Map> newDefinitionPosToReferences = new LinkedHashMap<>(); + Map newReferenceToDefinition = new LinkedHashMap<>(); + ActionScript2VariableParser varParser = new ActionScript2VariableParser(swf); + varParser.parse(fullText, newDefinitionPosToReferences, newReferenceToDefinition); + definitionPosToReferences = newDefinitionPosToReferences; + referenceToDefinition = newReferenceToDefinition; + } catch (BadLocationException | ActionParseException | IOException | InterruptedException ex) { + definitionPosToReferences.clear(); + referenceToDefinition.clear(); + } + } + + @Override + public void insertUpdate(DocumentEvent e) { + documentUpdated(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + documentUpdated(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + documentUpdated(); + } +} diff --git a/src/com/jpexs/decompiler/flash/gui/editor/DebuggableEditorPane.java b/src/com/jpexs/decompiler/flash/gui/editor/DebuggableEditorPane.java index 048ea5798..6339c06ab 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/DebuggableEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/DebuggableEditorPane.java @@ -16,12 +16,14 @@ */ package com.jpexs.decompiler.flash.gui.editor; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.gui.Main; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; +import java.lang.ref.WeakReference; import java.util.List; import java.util.Set; import javax.swing.UIManager; @@ -77,6 +79,8 @@ public class DebuggableEditorPane extends LineMarkedEditorPane implements BreakP private LineNumbersBreakpointsRuler ruler; private boolean showMarkers = true; + + private WeakReference swfRef = new WeakReference(null); public DebuggableEditorPane() { @@ -88,6 +92,14 @@ public class DebuggableEditorPane extends LineMarkedEditorPane implements BreakP } } + public void setSwf(SWF swf) { + this.swfRef = new WeakReference<>(swf); + } + + public SWF getSwf() { + return swfRef.get(); + } + public synchronized void setScriptName(String scriptName, String breakPointScriptName) { this.scriptName = scriptName; this.breakPointScriptName = breakPointScriptName;