Compile AS3 @identifier asdoc tag as identifier replacement

This commit is contained in:
Jindra Petřík
2025-07-25 19:08:38 +02:00
parent 90a82a538a
commit e44e2eaa2b
20 changed files with 2674 additions and 898 deletions

View File

@@ -137,7 +137,7 @@ NamespaceSuffix = "#" {DecIntegerLiteral}
RegExp = \/([^\r\n/]|\\\/)+\/[a-z]*
%state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER
%state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER, ADOC, ADOC_TAG
%%
@@ -191,6 +191,13 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]*
"typeof" |
"void" { return token(TokenType.KEYWORD); }
// AsDoc comments need a state so that we can highlight the @ controls
"/**" {
yybegin(ADOC);
tokenStart = yychar;
tokenLength = 3;
}
/* comments */
{Comment} { return token(TokenType.COMMENT); }
@@ -358,6 +365,44 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]*
{LineTerminator} { yybegin(YYINITIAL); }
}
<ADOC> {
"*/" {
yybegin(YYINITIAL);
return token(TokenType.COMMENT, tokenStart, tokenLength + 2);
}
"@" {
yybegin(ADOC_TAG);
int start = tokenStart;
tokenStart = yychar;
int len = tokenLength;
tokenLength = 1;
return token(TokenType.COMMENT, start, len);
}
.|\n { tokenLength ++; }
}
<ADOC_TAG> {
([:letter:])+ { tokenLength += yylength(); }
"*/" {
yybegin(YYINITIAL);
return token(TokenType.COMMENT, tokenStart, tokenLength + 2);
}
.|\n {
yybegin(ADOC);
// length also includes the trailing quote
int start = tokenStart;
tokenStart = yychar;
int len = tokenLength;
tokenLength = 1;
return token(TokenType.COMMENT2, start, len);
}
}
/* error fallback */
[^] { }
<<EOF>> { return null; }

View File

@@ -66,7 +66,7 @@ import java.util.List;
this.offset = ofst;
prevToken = null;
Token t = yylex();
if (t.type != TokenType.COMMENT) {
if (t != null && t.type != TokenType.COMMENT) {
prevToken = t;
}
for (; t != null; t = yylex()) {
@@ -151,7 +151,7 @@ RegExp = \/([^\r\n/]|\\\/)+\/[a-z]*
VerbatimStringCharacter = [^\r\n\"]
VerbatimString = "@\"" {VerbatimStringCharacter}* "\""
%state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER, XMLCOMMENT, XMLCDATA
%state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER, XMLCOMMENT, XMLCDATA, ADOC, ADOC_TAG
%%
@@ -215,6 +215,12 @@ VerbatimString = "@\"" {VerbatimStringCharacter}* "\""
"new" { prevNew = true; return token(TokenType.KEYWORD); }
// AsDoc comments need a state so that we can highlight the @ controls
"/**" {
yybegin(ADOC);
tokenStart = yychar;
tokenLength = 3;
}
/* comments */
{Comment} { return token(TokenType.COMMENT); }
@@ -456,6 +462,44 @@ VerbatimString = "@\"" {VerbatimStringCharacter}* "\""
}
}
<ADOC> {
"*/" {
yybegin(YYINITIAL);
return token(TokenType.COMMENT, tokenStart, tokenLength + 2);
}
"@" {
yybegin(ADOC_TAG);
int start = tokenStart;
tokenStart = yychar;
int len = tokenLength;
tokenLength = 1;
return token(TokenType.COMMENT, start, len);
}
.|\n { tokenLength ++; }
}
<ADOC_TAG> {
([:letter:])+ { tokenLength += yylength(); }
"*/" {
yybegin(YYINITIAL);
return token(TokenType.COMMENT, tokenStart, tokenLength + 2);
}
.|\n {
yybegin(ADOC);
// length also includes the trailing quote
int start = tokenStart;
tokenStart = yychar;
int len = tokenLength;
tokenLength = 1;
return token(TokenType.COMMENT2, start, len);
}
}
/* error fallback */
[^] { }
<<EOF>> { return null; }