Fixed: #2586 AS3 direct editation + decompilation - XML escape sequences and other XML problems

This commit is contained in:
Jindra Petřík
2026-01-03 23:58:04 +01:00
parent 41b9d1874b
commit b9e00fd673
11 changed files with 255 additions and 14 deletions
@@ -58,6 +58,8 @@ import java.util.List;
private boolean prevNew = false;
private int xmlNestingLevel = 0;
@Override
public void parse(Segment segment, int ofst, List<Token> tokens) {
try {
@@ -115,10 +117,10 @@ IdentifierNs = {Identifier} ":" {Identifier}
/* XML */
LetterColon = [:jletter] | ":"
XMLIdentifier = {Identifier} | {IdentifierNs}
XMLAttribute = " "* {XMLIdentifier} " "* "=" " "* (\" {InputCharacter}* \" | "'" {InputCharacter}* "'") " "*
XMLBeginOneTag = "<" {XMLIdentifier} {XMLAttribute}* ">" | "<{" {XMLIdentifier} "}" {XMLAttribute}* " "* ">"
XMLBeginTag = "<" {XMLIdentifier} " " | "<{" {XMLIdentifier} "} "
XMLEndTag = "</" {XMLIdentifier} " "* ">" | "</{" {XMLIdentifier} "}" " "* ">"
XMLAttribute = {WhiteSpace}* {XMLIdentifier} {WhiteSpace}* "=" {WhiteSpace}* (\" {InputCharacter}* \" | "'" {InputCharacter}* "'") {WhiteSpace}*
XMLBeginOneTag = "<" {XMLIdentifier} {XMLAttribute}* {WhiteSpace}* "/"? ">" | "<{" {XMLIdentifier} "}" {XMLAttribute}* {WhiteSpace}* "/"? ">"
XMLBeginTag = "<" {XMLIdentifier} {WhiteSpace}+ | "<{" {XMLIdentifier} "}" {WhiteSpace}
XMLEndTag = "</" {XMLIdentifier} {WhiteSpace}* ">" | "</{" {XMLIdentifier} "}" {WhiteSpace}* ">"
/* integer literals */
DecIntegerLiteral = (0 | -?[1-9][0-9]*) [ui]?
@@ -346,15 +348,20 @@ VerbatimString = "@\"" {VerbatimStringCharacter}* "\""
yypushback(yytext().length() - 1);
return token(TokenType.OPERATOR, yychar, 1);
}
yybegin(XML);
tokenStart = yychar;
tokenLength = yylength();
String s=yytext();
s=s.substring(1,s.length()-1);
s = s.substring(1,s.length()-1);
if (s.endsWith("/")) {
return token(TokenType.STRING, tokenStart, tokenLength);
}
if(s.contains(" ")){
s=s.substring(0,s.indexOf(" "));
}
xmlTagName = s;
yybegin(XML);
xmlTagName = s;
xmlNestingLevel = 1;
}
">" { prevNew = false; return token(TokenType.OPERATOR); }
@@ -373,12 +380,18 @@ VerbatimString = "@\"" {VerbatimStringCharacter}* "\""
">" { yybegin(XML); tokenLength += yylength();}
}
<XML> {
{XMLBeginOneTag} { tokenLength += yylength();}
{XMLEndTag} { tokenLength += yylength();
String endtagname=yytext();
endtagname = endtagname.substring(2,endtagname.length()-1);
endtagname = endtagname.trim();
if(endtagname.equals(xmlTagName)){
{XMLBeginOneTag} {
tokenLength += yylength();
String s = yytext();
if (s.charAt(s.length() - 2) != '/') {
xmlNestingLevel++;
}
}
{XMLEndTag} {
xmlNestingLevel--;
tokenLength += yylength();
if (xmlNestingLevel == 0) {
yybegin(YYINITIAL);
return token(TokenType.STRING, tokenStart, tokenLength);
}