From 75c8639d77ca081788f5f993e39415eaf7778d36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 26 May 2025 22:30:16 +0200 Subject: [PATCH] Added: AS1/2 - highlight variable definition and all its instances on cursor place Fixed: AS1/2 - Incorrect DefineFunction2 parameter names when parameter name is empty --- CHANGELOG.md | 3 + lib/jsyntaxpane-0.9.5.jar | Bin 607614 -> 607539 bytes .../ffdec_lib/lexers/actionscript_script.flex | 405 +-- .../action/model/FunctionActionItem.java | 33 +- .../parser/script/ActionScript2Parser.java | 2 +- .../script/ActionScript2VariableParser.java | 2479 +++++++++++++++++ .../parser/script/ActionScriptLexer.java | 694 ++--- .../action/parser/script/ParsedSymbol.java | 15 +- .../parser/script/VariableActionItem.java | 14 +- .../action/swf5/ActionDefineFunction.java | 2 +- .../action/swf7/ActionDefineFunction2.java | 2 +- .../jsyntaxpane/lexers/actionscript.flex | 4 - src/com/jpexs/decompiler/flash/gui/Main.java | 3 +- .../flash/gui/action/ActionPanel.java | 4 + .../gui/action/ActionVariableMarker.java | 235 ++ .../gui/editor/DebuggableEditorPane.java | 12 + 16 files changed, 3350 insertions(+), 557 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2VariableParser.java create mode 100644 src/com/jpexs/decompiler/flash/gui/action/ActionVariableMarker.java 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 67b2a6ce147cde51906bcd6c0c102727505fe828..133a8b69c934c87a5c1e974ae9ee4a2ff03a3555 100644 GIT binary patch delta 14225 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 { /* 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;