mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-06-14 04:11:56 +00:00
Issue #734 \xAB escapes, \uABCD escapes
Lexers moved to separate directory, JFlex 1.6.0 library for ant included Issue #687 allowing comments on separate line
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,300 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.
|
||||
*/
|
||||
/* Flash assembler language lexer specification */
|
||||
package com.jpexs.decompiler.flash.abc.avm2.parser.pcode;
|
||||
|
||||
import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException;
|
||||
import java.util.Stack;
|
||||
%%
|
||||
|
||||
%public
|
||||
%class Flasm3Lexer
|
||||
%final
|
||||
%unicode
|
||||
%ignorecase
|
||||
%char
|
||||
%line
|
||||
%column
|
||||
%type ParsedSymbol
|
||||
%throws AVM2ParseException
|
||||
|
||||
%{
|
||||
|
||||
StringBuffer string = new StringBuffer();
|
||||
boolean isMultiname = false;
|
||||
long multinameId = 0;
|
||||
|
||||
/**
|
||||
* Create an empty lexer, yyrset will be called later to reset and assign
|
||||
* the reader
|
||||
*/
|
||||
public Flasm3Lexer() {
|
||||
|
||||
}
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
private Stack<ParsedSymbol> pushedBack = new Stack<>();
|
||||
|
||||
public void pushback(ParsedSymbol symb) {
|
||||
pushedBack.push(symb);
|
||||
last = null;
|
||||
}
|
||||
|
||||
ParsedSymbol last;
|
||||
public ParsedSymbol lex() throws java.io.IOException, AVM2ParseException{
|
||||
ParsedSymbol ret = null;
|
||||
if (!pushedBack.isEmpty()){
|
||||
ret = last = pushedBack.pop();
|
||||
} else {
|
||||
ret = last = yylex();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
/* main character classes */
|
||||
LineTerminator = \r|\n|\r\n
|
||||
|
||||
InputCharacter = [^\r\n]
|
||||
Comment = ";" {InputCharacter}*
|
||||
|
||||
WhiteSpace = [ \t\f]+
|
||||
|
||||
Multiname = m\[[0-9]+\]
|
||||
|
||||
/* identifiers */
|
||||
|
||||
Identifier = [:jletter:][:jletterdigit:]*
|
||||
|
||||
InstructionName = [a-z][a-z0-9_]*
|
||||
|
||||
Label = {Identifier}:
|
||||
|
||||
|
||||
|
||||
/* integer literals */
|
||||
NumberLiteral = 0 | -?[1-9][0-9]*
|
||||
|
||||
PositiveNumberLiteral = 0 | [1-9][0-9]*
|
||||
|
||||
/* floating point literals */
|
||||
FloatLiteral = -?({FLit1}|{FLit2}|{FLit3}) {Exponent}?
|
||||
|
||||
FLit1 = [0-9]+ \. [0-9]*
|
||||
FLit2 = \. [0-9]+
|
||||
FLit3 = [0-9]+
|
||||
Exponent = [eE] [+-]? [0-9]+
|
||||
|
||||
HexDigit = [0-9a-fA-F]
|
||||
OctDigit = [0-7]
|
||||
|
||||
/* string and character literals */
|
||||
StringCharacter = [^\r\n\"\\]
|
||||
|
||||
ExceptionStart = "exceptionstart "{PositiveNumberLiteral}":"
|
||||
ExceptionEnd = "exceptionend "{PositiveNumberLiteral}":"
|
||||
ExceptionTarget = "exceptiontarget "{PositiveNumberLiteral}":"
|
||||
|
||||
%state STRING,PARAMETERS
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
|
||||
/* whitespace */
|
||||
{WhiteSpace} { }
|
||||
|
||||
{ExceptionStart} {
|
||||
String s=yytext();
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_START, Integer.parseInt(s.substring(15, s.length() - 1)));
|
||||
}
|
||||
{ExceptionEnd} {
|
||||
String s=yytext();
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_END, Integer.parseInt(s.substring(13, s.length() - 1)));
|
||||
}
|
||||
{ExceptionTarget} {
|
||||
String s=yytext();
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_EXCEPTION_TARGET,Integer.parseInt(s.substring(16, s.length() - 1)));
|
||||
}
|
||||
{Label} {
|
||||
String s = yytext();
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_LABEL, s.substring(0, s.length() - 1));
|
||||
}
|
||||
"name" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME, yytext());}
|
||||
"try" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRY, yytext());}
|
||||
"flag" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FLAG, yytext());}
|
||||
"param" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAM, yytext());}
|
||||
"paramname" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PARAMNAME, yytext());}
|
||||
"optional" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OPTIONAL, yytext());}
|
||||
"returns" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RETURNS, yytext());}
|
||||
"body" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_BODY, yytext());}
|
||||
"maxstack" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSTACK, yytext());}
|
||||
"localcount" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_LOCALCOUNT, yytext());}
|
||||
"initscopedepth" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INITSCOPEDEPTH, yytext());}
|
||||
"maxscopedepth" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MAXSCOPEDEPTH, yytext());}
|
||||
"code" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CODE, yytext());}
|
||||
"trait" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRAIT, yytext());}
|
||||
"method" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD, yytext());}
|
||||
|
||||
|
||||
/* identifiers */
|
||||
{InstructionName} { yybegin(PARAMETERS);
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_INSTRUCTION_NAME, yytext());
|
||||
}
|
||||
}
|
||||
|
||||
<PARAMETERS> {
|
||||
/* string literal */
|
||||
\" {
|
||||
isMultiname = false;
|
||||
yybegin(STRING);
|
||||
string.setLength(0);
|
||||
}
|
||||
{Multiname}\" {
|
||||
isMultiname = true;
|
||||
String s = yytext();
|
||||
multinameId = Long.parseLong(s.substring(2, s.length() - 2));
|
||||
yybegin(STRING);
|
||||
string.setLength(0);
|
||||
}
|
||||
/* multinames */
|
||||
"QName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAME, yytext());}
|
||||
"QNameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_QNAMEA, yytext());}
|
||||
"RTQName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAME, yytext());}
|
||||
"RTQNameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEA, yytext());}
|
||||
"RTQNameL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMEL, yytext());}
|
||||
"RTQNameLA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_RTQNAMELA, yytext());}
|
||||
"Multiname" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAME, yytext());}
|
||||
"MultinameA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMEA, yytext());}
|
||||
"MultinameL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMEL, yytext());}
|
||||
"MultinameLA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_MULTINAMELA, yytext());}
|
||||
"TypeName" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPENAME, yytext());}
|
||||
"null" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NULL, yytext());}
|
||||
"(" { return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_OPEN, yytext());}
|
||||
")" { return new ParsedSymbol(ParsedSymbol.TYPE_PARENT_CLOSE, yytext());}
|
||||
"[" { return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_OPEN, yytext());}
|
||||
"]" { return new ParsedSymbol(ParsedSymbol.TYPE_BRACKET_CLOSE, yytext());}
|
||||
"<" { return new ParsedSymbol(ParsedSymbol.TYPE_LOWERTHAN, yytext());}
|
||||
">" { return new ParsedSymbol(ParsedSymbol.TYPE_GREATERTHAN, yytext());}
|
||||
"Namespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAMESPACE, yytext());}
|
||||
"PrivateNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PRIVATENAMESPACE, yytext());}
|
||||
"PackageNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGENAMESPACE, yytext());}
|
||||
"PackageInternalNs" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PACKAGEINTERNALNS, yytext());}
|
||||
"ProtectedNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_PROTECTEDNAMESPACE, yytext());}
|
||||
"ExplicitNamespace" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICITNAMESPACE, yytext());}
|
||||
"StaticProtectedNs" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_STATICPROTECTEDNS, yytext());}
|
||||
"," { return new ParsedSymbol(ParsedSymbol.TYPE_COMMA, yytext());}
|
||||
|
||||
/*Try*/
|
||||
"from" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FROM, yytext());}
|
||||
"to" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TO, yytext());}
|
||||
"target" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TARGET, yytext());}
|
||||
"name" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NAME, yytext());}
|
||||
"type" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TYPE, yytext());}
|
||||
|
||||
"slot" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOT, yytext());}
|
||||
"const" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CONST, yytext());}
|
||||
"method" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METHOD, yytext());}
|
||||
"getter" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_GETTER, yytext());}
|
||||
"setter" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SETTER, yytext());}
|
||||
"class" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_CLASS, yytext());}
|
||||
"function" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FUNCTION, yytext());}
|
||||
"dispid" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DISPID, yytext());}
|
||||
"slotid" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SLOTID, yytext());}
|
||||
"value" { yybegin(PARAMETERS); return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_VALUE, yytext());}
|
||||
|
||||
|
||||
|
||||
/*Flags*/
|
||||
"EXPLICIT" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_EXPLICIT, yytext());}
|
||||
"HAS_OPTIONAL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_OPTIONAL, yytext());}
|
||||
"HAS_PARAM_NAMES" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_HAS_PARAM_NAMES, yytext());}
|
||||
"IGNORE_REST" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_IGNORE_REST, yytext());}
|
||||
"NEED_ACTIVATION" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ACTIVATION, yytext());}
|
||||
"NEED_ARGUMENTS" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_ARGUMENTS, yytext());}
|
||||
"NEED_REST" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_NEED_REST, yytext());}
|
||||
"SET_DXNS" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_SET_DXNS, yytext());}
|
||||
|
||||
/* Value types*/
|
||||
"Integer" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_INTEGER, yytext());}
|
||||
"UInteger" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UINTEGER, yytext());}
|
||||
"Double" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DOUBLE, yytext());}
|
||||
"Decimal" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_DECIMAL, yytext());}
|
||||
"Utf8" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UTF8, yytext());}
|
||||
"True" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_TRUE, yytext());}
|
||||
"False" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FALSE, yytext());}
|
||||
"Undefined" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_UNDEFINED, yytext());}
|
||||
|
||||
|
||||
"FINAL" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_FINAL, yytext());}
|
||||
"OVERRIDE" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_OVERRIDE, yytext());}
|
||||
"METADATA" { return new ParsedSymbol(ParsedSymbol.TYPE_KEYWORD_METADATA, yytext());}
|
||||
|
||||
/* numeric literals */
|
||||
|
||||
{NumberLiteral} { return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER, Long.parseLong((yytext()))); }
|
||||
{FloatLiteral} { return new ParsedSymbol(ParsedSymbol.TYPE_FLOAT, Double.parseDouble((yytext()))); }
|
||||
{Identifier} { return new ParsedSymbol(ParsedSymbol.TYPE_IDENTIFIER, yytext()); }
|
||||
{LineTerminator} {yybegin(YYINITIAL);}
|
||||
{Comment} {return new ParsedSymbol(ParsedSymbol.TYPE_COMMENT, yytext().substring(1));}
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
\" {
|
||||
yybegin(PARAMETERS);
|
||||
// length also includes the trailing quote
|
||||
if (isMultiname){
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_MULTINAME, multinameId);
|
||||
} else {
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_STRING, string.toString());
|
||||
}
|
||||
}
|
||||
|
||||
{StringCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* error cases */
|
||||
\\. { throw new AVM2ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { throw new AVM2ParseException("Unterminated string at end of line", yyline + 1); }
|
||||
|
||||
}
|
||||
|
||||
/* error fallback */
|
||||
[^] { }
|
||||
<<EOF>> { return new ParsedSymbol(ParsedSymbol.TYPE_EOF); }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,658 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.abc.avm2.parser.script;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.parser.AVM2ParseException;
|
||||
import java.io.StringReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
%%
|
||||
|
||||
%public
|
||||
%class ActionScriptLexer
|
||||
%final
|
||||
%unicode
|
||||
%char
|
||||
%type ParsedSymbol
|
||||
%throws AVM2ParseException
|
||||
|
||||
%{
|
||||
|
||||
private String sourceCode;
|
||||
|
||||
public ActionScriptLexer(String sourceCode){
|
||||
this(new StringReader(sourceCode));
|
||||
this.sourceCode = sourceCode;
|
||||
}
|
||||
|
||||
public void yypushbackstr(String s, int state)
|
||||
{
|
||||
sourceCode = s + sourceCode.substring(yychar + yylength());
|
||||
yyreset(new StringReader(sourceCode));
|
||||
yybegin(state);
|
||||
}
|
||||
|
||||
public void yypushbackstr(String s)
|
||||
{
|
||||
yypushbackstr(s, YYINITIAL);
|
||||
}
|
||||
|
||||
StringBuffer string = new StringBuffer();
|
||||
|
||||
private static String xmlTagName = "";
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
private Stack<ParsedSymbol> pushedBack = new Stack<>();
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
private List<LexListener> listeners=new ArrayList<>();
|
||||
|
||||
public void addListener(LexListener listener){
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeListener(LexListener listener){
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
public void informListenersLex(ParsedSymbol s){
|
||||
for(LexListener l:listeners){
|
||||
l.onLex(s);
|
||||
}
|
||||
}
|
||||
|
||||
public void informListenersPushBack(ParsedSymbol s){
|
||||
for(LexListener l:listeners){
|
||||
l.onPushBack(s);
|
||||
}
|
||||
}
|
||||
|
||||
public void pushback(ParsedSymbol symb) {
|
||||
pushedBack.push(symb);
|
||||
last = null;
|
||||
informListenersPushBack(symb);
|
||||
}
|
||||
|
||||
ParsedSymbol last;
|
||||
public ParsedSymbol lex() throws java.io.IOException, AVM2ParseException{
|
||||
ParsedSymbol ret = null;
|
||||
if (!pushedBack.isEmpty()){
|
||||
ret = last = pushedBack.pop();
|
||||
} else {
|
||||
ret = last = yylex();
|
||||
}
|
||||
informListenersLex(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
/* main character classes */
|
||||
LineTerminator = \r|\n|\r\n
|
||||
InputCharacter = [^\r\n]
|
||||
|
||||
WhiteSpace = {LineTerminator} | [ \t\f]+
|
||||
|
||||
/* comments */
|
||||
Comment = {TraditionalComment} | {EndOfLineComment}
|
||||
|
||||
TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/"
|
||||
EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?
|
||||
|
||||
|
||||
IdentFirst = [\p{Lu}\p{Ll}\p{Lt}\p{Lm}\p{Lo}_$]
|
||||
IdentNext = {IdentFirst} | [\p{Nl}\p{Mn}\p{Mc}\p{Nd}\p{Pc}]
|
||||
|
||||
|
||||
/* identifiers */
|
||||
Identifier = {IdentFirst}{IdentNext}*
|
||||
|
||||
TypeNameSpec = ".<"
|
||||
|
||||
/* XML */
|
||||
|
||||
XmlS = (\u0020 | \u0009 | \u000D | \u000A)+
|
||||
|
||||
XmlCommentStart = "<!--"
|
||||
XmlCommentEnd = "-->"
|
||||
|
||||
XmlNameStartChar = ":" | [A-Z] | "_" | [a-z]
|
||||
XmlNameStartCharUnicode = [\u00C0-\u00D6] |
|
||||
[\u00D8-\u00F6] |
|
||||
[\u00F8-\u02FF] |
|
||||
[\u0370-\u037D] |
|
||||
[\u037F-\u1FFF] |
|
||||
[\u200C-\u200D] |
|
||||
[\u2070-\u218F] |
|
||||
[\u2C00-\u2FEF] |
|
||||
[\u3001-\uD7FF] |
|
||||
[\uF900-\uFDCF] |
|
||||
[\uFDF0-\uFFFD] |
|
||||
[\u10000-\uEFFFF]
|
||||
|
||||
XmlNameChar = {XmlNameStartChar} | "-" | "." | [0-9] | \u00B7
|
||||
XmlNameCharUnicode = [\u0300-\u036F] | [\u0203F-\u2040]
|
||||
XmlName = {XmlNameStartChar} {XmlNameChar}*
|
||||
XmlNameUnicode = ({XmlNameStartChar}|{XmlNameStartCharUnicode}) ({XmlNameChar}|{XmlNameCharUnicode})*
|
||||
|
||||
/* XML Processing Instructions */
|
||||
XmlInstrStart = "<?" {XmlName}
|
||||
XmlInstrEnd = "?>"
|
||||
|
||||
/* CDATA */
|
||||
XmlCDataStart = "<![CDATA["
|
||||
XmlCDataEnd = "]]>"
|
||||
|
||||
/* Tags */
|
||||
XmlOpenTagStart = "<" {XmlName}
|
||||
XmlOpenTagClose = "/>"
|
||||
XmlOpenTagEnd = ">"
|
||||
|
||||
XmlCloseTag = "</" {XmlName} {XmlS}* ">"
|
||||
|
||||
/* attribute */
|
||||
XmlAttribute = {XmlName} "="
|
||||
|
||||
/* string and character literals */
|
||||
XmlDQuoteStringChar = [^\r\n\"]
|
||||
XmlSQuoteStringChar = [^\r\n\']
|
||||
|
||||
|
||||
|
||||
/* integer literals */
|
||||
DecIntegerLiteral = 0 | [1-9][0-9]*
|
||||
|
||||
HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8}
|
||||
HexDigit = [0-9a-fA-F]
|
||||
|
||||
OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15}
|
||||
OctDigit = [0-7]
|
||||
|
||||
/* floating point literals */
|
||||
DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}?
|
||||
|
||||
FLit1 = [0-9]+ \. [0-9]*
|
||||
FLit2 = \. [0-9]+
|
||||
FLit3 = [0-9]+
|
||||
Exponent = [eE] [+-]? [0-9]+
|
||||
|
||||
/* string and character literals */
|
||||
StringCharacter = [^\r\n\"\\]
|
||||
SingleCharacter = [^\r\n\'\\]
|
||||
OIdentifierCharacter = [^\r\n\u00A7\\]
|
||||
|
||||
%state STRING, CHARLITERAL,XMLOPENTAG,XMLOPENTAGATTRIB,XMLINSTROPENTAG,XMLINSTRATTRIB,XMLCDATA,XMLCOMMENT,XML,OIDENTIFIER
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* 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.IDENTIFIER, 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.IDENTIFIER, SymbolType.DYNAMIC, yytext()); }
|
||||
"internal" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERNAL, yytext()); }
|
||||
"override" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.OVERRIDE, yytext()); }
|
||||
"private" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); }
|
||||
"protected" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PROTECTED, yytext()); }
|
||||
"public" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PUBLIC, yytext()); }
|
||||
"static" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.STATIC, yytext()); }
|
||||
"class" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CLASS, yytext()); }
|
||||
"const" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONST, yytext()); }
|
||||
"extends" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.EXTENDS, yytext()); }
|
||||
"function" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.FUNCTION, yytext()); }
|
||||
"get" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.GET, yytext()); }
|
||||
"implements" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPLEMENTS, yytext()); }
|
||||
"interface" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERFACE, yytext()); }
|
||||
"namespace" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.NAMESPACE, yytext()); }
|
||||
"package" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PACKAGE, yytext()); }
|
||||
"set" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.SET, yytext()); }
|
||||
"var" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.VAR, yytext()); }
|
||||
"import" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IMPORT, yytext()); }
|
||||
"use" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.USE, 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()); }
|
||||
"undefined" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); }
|
||||
"Infinity" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); }
|
||||
"NaN" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); }
|
||||
"final" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.FINAL, yytext()); }
|
||||
"native" { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.NATIVE, 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()); }
|
||||
"as" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); }
|
||||
"delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); }
|
||||
"instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); }
|
||||
"is" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); }
|
||||
"::" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, 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()); }
|
||||
".(" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.FILTER, yytext()); }
|
||||
".." { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DESCENDANTS, yytext()); }
|
||||
|
||||
/* string literal */
|
||||
\" {
|
||||
string.setLength(0);
|
||||
yybegin(STRING);
|
||||
}
|
||||
"\u00A7" {
|
||||
string.setLength(0);
|
||||
yybegin(OIDENTIFIER);
|
||||
}
|
||||
|
||||
/* character literal */
|
||||
\' {
|
||||
string.setLength(0);
|
||||
yybegin(CHARLITERAL);
|
||||
}
|
||||
|
||||
/* numeric literals */
|
||||
|
||||
{DecIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); }
|
||||
|
||||
{HexIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); }
|
||||
|
||||
{OctIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); }
|
||||
|
||||
{DoubleLiteral} { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); }
|
||||
|
||||
/* comments */
|
||||
{Comment} { /*ignore*/ }
|
||||
|
||||
{LineTerminator} { yyline++;}
|
||||
/* whitespace */
|
||||
{WhiteSpace} { /*ignore*/ }
|
||||
{TypeNameSpec} { return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, yytext()); }
|
||||
{XmlOpenTagStart} {
|
||||
yybegin(XMLOPENTAG);
|
||||
string.setLength(0);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext());
|
||||
}
|
||||
"<{" { return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext()); }
|
||||
/* identifiers */
|
||||
{Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); }
|
||||
|
||||
}
|
||||
|
||||
<XMLOPENTAG> {
|
||||
{XmlAttribute} {
|
||||
yybegin(XMLOPENTAGATTRIB);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTENAME, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
"{" {
|
||||
yybegin(YYINITIAL);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRNAMEVAR_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{XmlOpenTagEnd} {
|
||||
yybegin(XML);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_END, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{XmlOpenTagClose} {
|
||||
yybegin(XML);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTFINISHTAG_END, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
{WhiteSpace} { string.append(yytext()); }
|
||||
}
|
||||
|
||||
|
||||
|
||||
<XMLOPENTAGATTRIB> {
|
||||
\"{XmlDQuoteStringChar}*\" {
|
||||
yybegin(XMLOPENTAG);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext());
|
||||
}
|
||||
"{" {
|
||||
yybegin(YYINITIAL);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRVALVAR_BEGIN, yytext());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
<XMLINSTROPENTAG> {
|
||||
{XmlAttribute} {
|
||||
yybegin(XMLINSTRATTRIB);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTENAME, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
"{" {
|
||||
yybegin(YYINITIAL);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRNAMEVAR_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{XmlInstrEnd} {
|
||||
yybegin(XML);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTR_END, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
{WhiteSpace} { string.append(yytext()); }
|
||||
}
|
||||
|
||||
<XMLINSTRATTRIB> {
|
||||
\"{XmlDQuoteStringChar}*\" {
|
||||
yybegin(XMLINSTROPENTAG);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext());
|
||||
}
|
||||
\"{XmlSQuoteStringChar}*\" {
|
||||
yybegin(XMLINSTROPENTAG);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_ATTRIBUTEVALUE, yytext());
|
||||
}
|
||||
"{" {
|
||||
yybegin(YYINITIAL);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRATTRVALVAR_BEGIN, yytext());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
<XMLCDATA> {
|
||||
{XmlCDataEnd} {
|
||||
string.append(yytext());
|
||||
yybegin(XML);
|
||||
String ret = string.toString();
|
||||
string.setLength(0);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_CDATA, ret);
|
||||
}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
[^] { string.append(yytext()); }
|
||||
}
|
||||
|
||||
<XMLCOMMENT> {
|
||||
{XmlCommentEnd} {
|
||||
string.append(yytext());
|
||||
yybegin(XML);
|
||||
String ret = string.toString();
|
||||
string.setLength(0);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_COMMENT, ret);
|
||||
}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
[^] { string.append(yytext());}
|
||||
}
|
||||
|
||||
<XML> {
|
||||
{XmlCDataStart} {
|
||||
String ret = string.toString(); string.setLength(0); string.append(yytext() ); yybegin(XMLCDATA);
|
||||
if (!ret.isEmpty()) return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, ret);
|
||||
}
|
||||
{XmlInstrStart} {
|
||||
yybegin(XMLINSTROPENTAG);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTR_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
"<?{" {
|
||||
yybegin(YYINITIAL);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_INSTRVARTAG_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{XmlCommentStart} {
|
||||
String ret = string.toString(); string.setLength(0); string.append(yytext()); yybegin(XMLCOMMENT);
|
||||
if (!ret.isEmpty()) return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, ret);
|
||||
}
|
||||
{XmlOpenTagStart} {
|
||||
yybegin(XMLOPENTAG);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTTAG_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{XmlCloseTag} {
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHTAG, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
|
||||
"<{" {
|
||||
yybegin(YYINITIAL);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_STARTVARTAG_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
"</{" {
|
||||
yybegin(YYINITIAL);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_FINISHVARTAG_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
"{" {
|
||||
yybegin(YYINITIAL);
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_VAR_BEGIN, yytext()));
|
||||
if (string.length() > 0){
|
||||
pushback(new ParsedSymbol(SymbolGroup.XML, SymbolType.XML_TEXT, string.toString()));
|
||||
string.setLength(0);
|
||||
}
|
||||
return lex();
|
||||
}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
[^] { string.append(yytext()); }
|
||||
}
|
||||
|
||||
<OIDENTIFIER> {
|
||||
"\u00A7" {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString());
|
||||
}
|
||||
|
||||
{OIdentifierCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\§" { string.append('\u00A7'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
|
||||
/* escape sequences */
|
||||
|
||||
\\. { throw new AVM2ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { yybegin(YYINITIAL); yyline++;}
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
\" {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString());
|
||||
}
|
||||
|
||||
{StringCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* escape sequences */
|
||||
|
||||
\\. { throw new AVM2ParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { yybegin(YYINITIAL); yyline++;}
|
||||
}
|
||||
|
||||
<CHARLITERAL> {
|
||||
\' {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString());
|
||||
}
|
||||
|
||||
{SingleCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* escape sequences */
|
||||
|
||||
\\. { throw new AVM2ParseException("Illegal escape sequence \""+ yytext() +"\"", yyline + 1); }
|
||||
{LineTerminator} { yybegin(YYINITIAL); yyline++;}
|
||||
}
|
||||
|
||||
/* error fallback */
|
||||
[^] { }
|
||||
<<EOF>> { return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,177 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.
|
||||
*/
|
||||
/* Method info lexer specification */
|
||||
package com.jpexs.decompiler.flash.abc.methodinfo_parser;
|
||||
|
||||
%%
|
||||
|
||||
%public
|
||||
%class MethodInfoLexer
|
||||
%final
|
||||
%unicode
|
||||
%char
|
||||
%line
|
||||
%column
|
||||
%type ParsedSymbol
|
||||
%throws MethodInfoParseException
|
||||
|
||||
%{
|
||||
|
||||
StringBuffer string = new StringBuffer();
|
||||
boolean isMultiname = false;
|
||||
long multinameId = 0;
|
||||
|
||||
/**
|
||||
* Create an empty lexer, yyrset will be called later to reset and assign
|
||||
* the reader
|
||||
*/
|
||||
public MethodInfoLexer() {
|
||||
|
||||
}
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
/* main character classes */
|
||||
LineTerminator = \r|\n|\r\n
|
||||
|
||||
WhiteSpace = [ \t\f]+
|
||||
|
||||
|
||||
|
||||
/* identifiers */
|
||||
|
||||
Identifier = [:jletter:][:jletterdigit:]*
|
||||
|
||||
/* integer literals */
|
||||
NumberLiteral = 0 | -?[1-9][0-9]*
|
||||
|
||||
PositiveNumberLiteral = 0 | [1-9][0-9]*
|
||||
|
||||
Multiname = m\[{PositiveNumberLiteral}\]
|
||||
|
||||
Namespace = ns\{PositiveNumberLiteral}\]
|
||||
|
||||
/* floating point literals */
|
||||
FloatLiteral = -?({FLit1}|{FLit2}|{FLit3}) {Exponent}?
|
||||
|
||||
FLit1 = [0-9]+ \. [0-9]*
|
||||
FLit2 = \. [0-9]+
|
||||
FLit3 = [0-9]+
|
||||
Exponent = [eE] [+-]? [0-9]+
|
||||
|
||||
HexDigit = [0-9a-fA-F]
|
||||
OctDigit = [0-7]
|
||||
|
||||
/* string and character literals */
|
||||
StringCharacter = [^\r\n\"\\]
|
||||
|
||||
%state STRING
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
/* whitespace */
|
||||
{WhiteSpace} { }
|
||||
{Multiname}\" {
|
||||
isMultiname = true;
|
||||
String s = yytext();
|
||||
multinameId = Long.parseLong(s.substring(2, s.length() - 2));
|
||||
yybegin(STRING);
|
||||
string.setLength(0);
|
||||
}
|
||||
/* string literal */
|
||||
\" {
|
||||
isMultiname = false;
|
||||
yybegin(STRING);
|
||||
string.setLength(0);
|
||||
}
|
||||
|
||||
|
||||
/* numeric literals */
|
||||
|
||||
{NumberLiteral} { return new ParsedSymbol(ParsedSymbol.TYPE_INTEGER, Long.parseLong((yytext()))); }
|
||||
{FloatLiteral} { return new ParsedSymbol(ParsedSymbol.TYPE_FLOAT, Double.parseDouble((yytext()))); }
|
||||
|
||||
":" {return new ParsedSymbol(ParsedSymbol.TYPE_COLON);}
|
||||
"," {return new ParsedSymbol(ParsedSymbol.TYPE_COMMA);}
|
||||
"..." {return new ParsedSymbol(ParsedSymbol.TYPE_DOTS);}
|
||||
"*" {return new ParsedSymbol(ParsedSymbol.TYPE_STAR);}
|
||||
"=" {return new ParsedSymbol(ParsedSymbol.TYPE_ASSIGN);}
|
||||
|
||||
private {return new ParsedSymbol(ParsedSymbol.TYPE_PRIVATE);}
|
||||
protected {return new ParsedSymbol(ParsedSymbol.TYPE_PROTECTED);}
|
||||
package {return new ParsedSymbol(ParsedSymbol.TYPE_PACKAGE);}
|
||||
internal {return new ParsedSymbol(ParsedSymbol.TYPE_INTERNAL);}
|
||||
static {return new ParsedSymbol(ParsedSymbol.TYPE_STATIC);}
|
||||
explicit {return new ParsedSymbol(ParsedSymbol.TYPE_EXPLICIT);}
|
||||
{Namespace} {
|
||||
String s = yytext();
|
||||
long ns = Long.parseLong(s.substring(3, s.length() - 2));
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_NAMESPACE, ns);
|
||||
}
|
||||
true {return new ParsedSymbol(ParsedSymbol.TYPE_TRUE);}
|
||||
false {return new ParsedSymbol(ParsedSymbol.TYPE_FALSE);}
|
||||
null {return new ParsedSymbol(ParsedSymbol.TYPE_NULL);}
|
||||
undefined {return new ParsedSymbol(ParsedSymbol.TYPE_UNDEFINED);}
|
||||
{Identifier} {
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_IDENTIFIER, yytext()); }
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
\" {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
if (isMultiname){
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_MULTINAME, multinameId);
|
||||
} else {
|
||||
return new ParsedSymbol(ParsedSymbol.TYPE_STRING, string.toString());
|
||||
}
|
||||
}
|
||||
|
||||
{StringCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* error cases */
|
||||
\\. { throw new MethodInfoParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { throw new MethodInfoParseException("Unterminated string at end of line", yyline + 1); }
|
||||
|
||||
}
|
||||
|
||||
/* error fallback */
|
||||
[^] { }
|
||||
<<EOF>> { return new ParsedSymbol(ParsedSymbol.TYPE_EOF); }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,191 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.
|
||||
*/
|
||||
/* Flash assembler language lexer specification */
|
||||
package com.jpexs.decompiler.flash.action.parser.pcode;
|
||||
|
||||
import com.jpexs.decompiler.flash.action.parser.ActionParseException;
|
||||
import com.jpexs.decompiler.flash.action.swf4.ConstantIndex;
|
||||
import com.jpexs.decompiler.flash.action.swf4.RegisterNumber;
|
||||
import com.jpexs.decompiler.flash.ecma.Null;
|
||||
import com.jpexs.decompiler.flash.ecma.Undefined;
|
||||
|
||||
%%
|
||||
|
||||
%public
|
||||
%class FlasmLexer
|
||||
%final
|
||||
%unicode
|
||||
%char
|
||||
%line
|
||||
%column
|
||||
%type ASMParsedSymbol
|
||||
%throws ActionParseException
|
||||
|
||||
%{
|
||||
|
||||
StringBuffer string = new StringBuffer();
|
||||
|
||||
/**
|
||||
* Create an empty lexer, yyrset will be called later to reset and assign
|
||||
* the reader
|
||||
*/
|
||||
public FlasmLexer() {
|
||||
|
||||
}
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
/* main character classes */
|
||||
LineTerminator = \r|\n|\r\n
|
||||
|
||||
InputCharacter = [^\r\n]
|
||||
Comment = ";" {InputCharacter}*
|
||||
|
||||
WhiteSpace = [ \t\f]+
|
||||
|
||||
|
||||
/* identifiers */
|
||||
|
||||
Identifier = [:jletter:][:jletterdigit:]*
|
||||
|
||||
InstructionName = [a-zA-Z][a-zA-Z0-9_]*
|
||||
|
||||
Label = {Identifier}:
|
||||
|
||||
StartOfBlock = "{"
|
||||
|
||||
EndOfBlock = "}"
|
||||
|
||||
True = "true"
|
||||
False = "false"
|
||||
False = "false"
|
||||
Null = "null"
|
||||
Undefined = "undefined"
|
||||
|
||||
Infinity = -? "Infinity"
|
||||
|
||||
/* integer literals */
|
||||
PositiveNumberLiteral = 0 | [1-9][0-9]*
|
||||
NegativeNumberLiteral = - {PositiveNumberLiteral}
|
||||
|
||||
NumberLiteral = {PositiveNumberLiteral}|{NegativeNumberLiteral}
|
||||
|
||||
/* floating point literals */
|
||||
FloatLiteral = "NaN" | {Infinity} | (({FLit1}|{FLit2}|{FLit3}) {Exponent}?)
|
||||
|
||||
FLit1 = [0-9]+ \. [0-9]*
|
||||
FLit2 = \. [0-9]+
|
||||
FLit3 = [0-9]+
|
||||
Exponent = [eE] [+-]? [0-9]+
|
||||
|
||||
HexDigit = [0-9a-fA-F]
|
||||
OctDigit = [0-7]
|
||||
|
||||
/* string and character literals */
|
||||
StringCharacter = [^\r\n\"\\]
|
||||
|
||||
Register= register{PositiveNumberLiteral}
|
||||
Constant= constant{PositiveNumberLiteral}
|
||||
|
||||
%state STRING,PARAMETERS
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
|
||||
/* whitespace */
|
||||
{WhiteSpace} { }
|
||||
|
||||
{Label} {
|
||||
String s=yytext();
|
||||
return new ASMParsedSymbol(ASMParsedSymbol.TYPE_LABEL, s.substring(0, s.length() - 1));
|
||||
}
|
||||
|
||||
/* identifiers */
|
||||
{InstructionName} { yybegin(PARAMETERS);
|
||||
return new ASMParsedSymbol(ASMParsedSymbol.TYPE_INSTRUCTION_NAME, yytext());
|
||||
}
|
||||
{EndOfBlock} { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_BLOCK_END); }
|
||||
}
|
||||
|
||||
<PARAMETERS> {
|
||||
/* string literal */
|
||||
\" {
|
||||
yybegin(STRING);
|
||||
string.setLength(0);
|
||||
}
|
||||
|
||||
/* numeric literals */
|
||||
|
||||
{NumberLiteral} { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_INTEGER, Long.parseLong((yytext()))); }
|
||||
{FloatLiteral} { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_FLOAT, Double.parseDouble((yytext()))); }
|
||||
{LineTerminator} {yybegin(YYINITIAL); return new ASMParsedSymbol(ASMParsedSymbol.TYPE_EOL); }
|
||||
{Comment} {return new ASMParsedSymbol(ASMParsedSymbol.TYPE_COMMENT, yytext().substring(1));}
|
||||
{StartOfBlock} { yybegin(YYINITIAL); return new ASMParsedSymbol(ASMParsedSymbol.TYPE_BLOCK_START); }
|
||||
{True} {return new ASMParsedSymbol(ASMParsedSymbol.TYPE_BOOLEAN,Boolean.TRUE);}
|
||||
{False} {return new ASMParsedSymbol(ASMParsedSymbol.TYPE_BOOLEAN,Boolean.FALSE);}
|
||||
{Null} {return new ASMParsedSymbol(ASMParsedSymbol.TYPE_NULL, new Null());}
|
||||
{Undefined} {return new ASMParsedSymbol(ASMParsedSymbol.TYPE_UNDEFINED, new Undefined());}
|
||||
|
||||
{Register} { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_REGISTER, new RegisterNumber(Integer.parseInt(yytext().substring(8)))); }
|
||||
{Constant} { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_CONSTANT, new ConstantIndex(Integer.parseInt(yytext().substring(8)))); }
|
||||
|
||||
{Identifier} { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_IDENTIFIER, yytext()); }
|
||||
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
\" {
|
||||
yybegin(PARAMETERS);
|
||||
// length also includes the trailing quote
|
||||
return new ASMParsedSymbol(ASMParsedSymbol.TYPE_STRING, string.toString());
|
||||
}
|
||||
|
||||
{StringCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* error cases */
|
||||
\\. { throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { throw new ActionParseException("Unterminated string at end of line", yyline + 1); }
|
||||
|
||||
}
|
||||
|
||||
/* error fallback */
|
||||
[^] { }
|
||||
<<EOF>> { return new ASMParsedSymbol(ASMParsedSymbol.TYPE_EOF); }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,455 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.action.parser.ActionParseException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Stack;
|
||||
|
||||
%%
|
||||
|
||||
%public
|
||||
%class ActionScriptLexer
|
||||
%final
|
||||
%unicode
|
||||
%char
|
||||
%type ParsedSymbol
|
||||
%throws ActionParseException
|
||||
|
||||
%{
|
||||
|
||||
StringBuffer string = new StringBuffer();
|
||||
|
||||
private static String xmlTagName = "";
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
private final Stack<ParsedSymbol> pushedBack = new Stack<>();
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
private final List<LexListener> listeners = new ArrayList<>();
|
||||
|
||||
public void addListener(LexListener listener){
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeListener(LexListener listener){
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
public void informListenersLex(ParsedSymbol s){
|
||||
for(LexListener l:listeners){
|
||||
l.onLex(s);
|
||||
}
|
||||
}
|
||||
|
||||
public void informListenersPushBack(ParsedSymbol s){
|
||||
for(LexListener l:listeners){
|
||||
l.onPushBack(s);
|
||||
}
|
||||
}
|
||||
|
||||
public void pushback(ParsedSymbol symb) {
|
||||
pushedBack.push(symb);
|
||||
last = null;
|
||||
informListenersPushBack(symb);
|
||||
}
|
||||
|
||||
ParsedSymbol last;
|
||||
public ParsedSymbol lex() throws java.io.IOException, ActionParseException{
|
||||
ParsedSymbol ret = null;
|
||||
if (!pushedBack.isEmpty()){
|
||||
ret = last = pushedBack.pop();
|
||||
} else {
|
||||
ret = last = yylex();
|
||||
}
|
||||
informListenersLex(ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
/* main character classes */
|
||||
LineTerminator = \r|\n|\r\n
|
||||
InputCharacter = [^\r\n]
|
||||
|
||||
WhiteSpace = {LineTerminator} | [ \t\f]+
|
||||
|
||||
/* comments */
|
||||
Comment = {TraditionalComment} | {EndOfLineComment}
|
||||
|
||||
TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/"
|
||||
EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?
|
||||
|
||||
|
||||
|
||||
/* identifiers */
|
||||
Identifier = [:jletter:][:jletterdigit:]*
|
||||
|
||||
IdentifierNs = {Identifier} ":" {Identifier}
|
||||
|
||||
TypeNameSpec = ".<" {Identifier} ">"
|
||||
|
||||
/* XML */
|
||||
XMLIdentifier = {Identifier} | {IdentifierNs}
|
||||
XMLAttribute = " "* {XMLIdentifier} " "* "=" " "* \" {InputCharacter}* \" " "*
|
||||
XMLBeginOneTag = "<" {XMLIdentifier} {XMLAttribute}* ">"
|
||||
XMLEndTag = "</" {XMLIdentifier} ">"
|
||||
|
||||
/* integer literals */
|
||||
DecIntegerLiteral = 0 | [1-9][0-9]*
|
||||
|
||||
HexIntegerLiteral = 0 [xX] 0* {HexDigit} {1,8}
|
||||
HexDigit = [0-9a-fA-F]
|
||||
|
||||
OctIntegerLiteral = 0+ [1-3]? {OctDigit} {1,15}
|
||||
OctDigit = [0-7]
|
||||
|
||||
/* floating point literals */
|
||||
DoubleLiteral = ({FLit1}|{FLit2}|{FLit3}) {Exponent}?
|
||||
|
||||
FLit1 = [0-9]+ \. [0-9]*
|
||||
FLit2 = \. [0-9]+
|
||||
FLit3 = [0-9]+
|
||||
Exponent = [eE] [+-]? [0-9]+
|
||||
|
||||
/* string and character literals */
|
||||
StringCharacter = [^\r\n\"\\]
|
||||
SingleCharacter = [^\r\n\'\\]
|
||||
OIdentifierCharacter = [^\r\n\u00A7\\]
|
||||
|
||||
%state STRING, CHARLITERAL, XMLSTARTTAG, XML, OIDENTIFIER
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* 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()); }
|
||||
"internal" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.INTERNAL, yytext()); }
|
||||
"override" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.OVERRIDE, yytext()); }
|
||||
"private" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PRIVATE, yytext()); }
|
||||
"protected" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PROTECTED, 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()); }
|
||||
"const" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.CONST, 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()); }
|
||||
"namespace" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.NAMESPACE, yytext()); }
|
||||
"package" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.PACKAGE, 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()); }
|
||||
"use" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.USE, 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()); }
|
||||
"getUrl" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETURL, yytext()); }
|
||||
"trace" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TRACE, yytext()); }
|
||||
"gotoAndStop" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDSTOP, yytext()); }
|
||||
"nextFrame" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NEXTFRAME, yytext()); }
|
||||
"play" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PLAY, yytext()); }
|
||||
"prevFrame" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PREVFRAME, yytext()); }
|
||||
"tellTarget" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TELLTARGET, yytext()); }
|
||||
"stop" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOP, yytext()); }
|
||||
"stopAllSounds" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPALLSOUNDS, yytext()); }
|
||||
"toggleHighQuality" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TOGGLEHIGHQUALITY, yytext()); }
|
||||
"ifFrameLoaded" { return new ParsedSymbol(SymbolGroup.KEYWORD, SymbolType.IFFRAMELOADED, yytext()); }
|
||||
"ord" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.ORD, yytext()); }
|
||||
"chr" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CHR, yytext()); }
|
||||
"duplicateMovieClip" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.DUPLICATEMOVIECLIP, yytext()); }
|
||||
"stopDrag" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STOPDRAG, yytext()); }
|
||||
"getTimer" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETTIMER, yytext()); }
|
||||
"loadVariables" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLES, yytext()); }
|
||||
"loadMovie" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIE, yytext()); }
|
||||
"gotoAndPlay" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GOTOANDPLAY, yytext()); }
|
||||
"mbord" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBORD, yytext()); }
|
||||
"mbchr" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBCHR, yytext()); }
|
||||
"mblength" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBLENGTH, yytext()); }
|
||||
"mbsubstring" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.MBSUBSTRING, yytext()); }
|
||||
"random" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.RANDOM, yytext()); }
|
||||
"removeMovieClip" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.REMOVEMOVIECLIP, yytext()); }
|
||||
"startDrag" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STARTDRAG, yytext()); }
|
||||
"substr" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.SUBSTR, yytext()); }
|
||||
"length" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LENGTH, yytext()); }
|
||||
"int" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.INT, yytext()); }
|
||||
"targetPath" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.TARGETPATH, yytext()); }
|
||||
"Number" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.NUMBER_OP, yytext()); }
|
||||
"String" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.STRING_OP, yytext()); }
|
||||
"eval" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.EVAL, yytext()); }
|
||||
"undefined" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.UNDEFINED, yytext()); }
|
||||
"newline" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NEWLINE, yytext()); }
|
||||
"Infinity" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.INFINITY, yytext()); }
|
||||
"NaN" { return new ParsedSymbol(SymbolGroup.GLOBALCONST, SymbolType.NAN, yytext()); }
|
||||
"getVersion" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.GETVERSION, yytext()); }
|
||||
"call" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.CALL, yytext()); }
|
||||
"loadMovieNum" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADMOVIENUM, yytext()); }
|
||||
"loadVariablesNum" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.LOADVARIABLESNUM, yytext()); }
|
||||
"printAsBitmapNum" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAPNUM, yytext()); }
|
||||
"printNum" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTNUM, yytext()); }
|
||||
"printAsBitmap" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINTASBITMAP, yytext()); }
|
||||
"print" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.PRINT, yytext()); }
|
||||
"unloadMovie" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIE, yytext()); }
|
||||
"unloadMovieNum" { return new ParsedSymbol(SymbolGroup.GLOBALFUNC, SymbolType.UNLOADMOVIENUM, yytext()); }
|
||||
"fscommand" { return new ParsedSymbol(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()); }
|
||||
"as" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.AS, yytext()); }
|
||||
"delete" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.DELETE, yytext()); }
|
||||
"instanceof" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.INSTANCEOF, yytext()); }
|
||||
"is" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.IS, yytext()); }
|
||||
"::" { return new ParsedSymbol(SymbolGroup.OPERATOR, SymbolType.NAMESPACE_OP, 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()); }
|
||||
|
||||
/* string literal */
|
||||
\" {
|
||||
string.setLength(0);
|
||||
yybegin(STRING);
|
||||
}
|
||||
"\u00A7" {
|
||||
string.setLength(0);
|
||||
yybegin(OIDENTIFIER);
|
||||
}
|
||||
|
||||
|
||||
/* character literal */
|
||||
\' {
|
||||
string.setLength(0);
|
||||
yybegin(CHARLITERAL);
|
||||
}
|
||||
|
||||
/* numeric literals */
|
||||
|
||||
{DecIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong((yytext()))); }
|
||||
|
||||
{HexIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext().substring(2), 16)); }
|
||||
|
||||
{OctIntegerLiteral} { return new ParsedSymbol(SymbolGroup.INTEGER, SymbolType.INTEGER, Long.parseLong(yytext(), 8)); }
|
||||
|
||||
{DoubleLiteral} { return new ParsedSymbol(SymbolGroup.DOUBLE, SymbolType.DOUBLE, Double.parseDouble((yytext()))); }
|
||||
|
||||
/* comments */
|
||||
{Comment} { /*ignore*/ }
|
||||
|
||||
{LineTerminator} { yyline++;}
|
||||
/* whitespace */
|
||||
{WhiteSpace} { /*ignore*/ }
|
||||
{TypeNameSpec} { String t = yytext(); return new ParsedSymbol(SymbolGroup.TYPENAME, SymbolType.TYPENAME, t.substring(2, t.length() - 1)); }
|
||||
{XMLBeginOneTag} {string.setLength(0);
|
||||
yybegin(XML);
|
||||
String s = yytext();
|
||||
s = s.substring(1, s.length() - 1);
|
||||
if (s.contains(" ")){
|
||||
s = s.substring(0, s.indexOf(' '));
|
||||
}
|
||||
xmlTagName = s;
|
||||
string.append(yytext());
|
||||
}
|
||||
/* identifiers */
|
||||
{Identifier} { return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, yytext()); }
|
||||
}
|
||||
|
||||
<XMLSTARTTAG> {
|
||||
{XMLAttribute} { string.append(yytext());}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
{WhiteSpace} { string.append(yytext()); }
|
||||
">" { yybegin(XML); string.append(yytext());}
|
||||
}
|
||||
<XML> {
|
||||
{XMLBeginOneTag} { string.append(yytext());}
|
||||
{XMLEndTag} { string.append(yytext());
|
||||
String endtagname = yytext();
|
||||
endtagname = endtagname.substring(2, endtagname.length() - 1);
|
||||
if (endtagname.equals(xmlTagName)){
|
||||
yybegin(YYINITIAL);
|
||||
return new ParsedSymbol(SymbolGroup.XML, SymbolType.XML, string.toString());
|
||||
}
|
||||
}
|
||||
{LineTerminator} { string.append(yytext()); yyline++;}
|
||||
[^] { string.append(yytext()); }
|
||||
}
|
||||
|
||||
<OIDENTIFIER> {
|
||||
"\u00A7" {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
return new ParsedSymbol(SymbolGroup.IDENTIFIER, SymbolType.IDENTIFIER, string.toString());
|
||||
}
|
||||
|
||||
{OIdentifierCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\\u00A7" { string.append('\u00A7'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
|
||||
/* escape sequences */
|
||||
|
||||
\\. { throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { yybegin(YYINITIAL); yyline++;}
|
||||
}
|
||||
|
||||
<STRING> {
|
||||
\" {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString());
|
||||
}
|
||||
|
||||
{StringCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* escape sequences */
|
||||
|
||||
\\. { throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { yybegin(YYINITIAL); yyline++;}
|
||||
}
|
||||
|
||||
<CHARLITERAL> {
|
||||
\' {
|
||||
yybegin(YYINITIAL);
|
||||
// length also includes the trailing quote
|
||||
return new ParsedSymbol(SymbolGroup.STRING, SymbolType.STRING, string.toString());
|
||||
}
|
||||
|
||||
{SingleCharacter}+ { string.append(yytext()); }
|
||||
|
||||
/* escape sequences */
|
||||
/* escape sequences */
|
||||
"\\b" { string.append('\b'); }
|
||||
"\\t" { string.append('\t'); }
|
||||
"\\n" { string.append('\n'); }
|
||||
"\\f" { string.append('\f'); }
|
||||
"\\r" { string.append('\r'); }
|
||||
"\\\"" { string.append('\"'); }
|
||||
"\\'" { string.append('\''); }
|
||||
"\\\\" { string.append('\\'); }
|
||||
\\[0-3]?{OctDigit}?{OctDigit} { char val = (char) Integer.parseInt(yytext().substring(1), 8);
|
||||
string.append(val); }
|
||||
|
||||
/* escape sequences */
|
||||
|
||||
\\. { throw new ActionParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
{LineTerminator} { yybegin(YYINITIAL); yyline++;}
|
||||
}
|
||||
|
||||
/* error fallback */
|
||||
[^] { }
|
||||
<<EOF>> { return new ParsedSymbol(SymbolGroup.EOF, SymbolType.EOF, null); }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,118 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.tags.text;
|
||||
|
||||
|
||||
%%
|
||||
|
||||
%public
|
||||
%class TextLexer
|
||||
%final
|
||||
%unicode
|
||||
%char
|
||||
%line
|
||||
%column
|
||||
%type ParsedSymbol
|
||||
%throws TextParseException
|
||||
|
||||
%{
|
||||
|
||||
StringBuffer string = null;
|
||||
boolean finish = false;
|
||||
String parameterName = null;
|
||||
|
||||
/**
|
||||
* Create an empty lexer, yyrset will be called later to reset and assign
|
||||
* the reader
|
||||
*/
|
||||
public TextLexer() {
|
||||
|
||||
}
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
Parameter = [a-z0-9_]+
|
||||
Value = [^ \r\n\]]+
|
||||
Divider = [ \r\n]+
|
||||
HexDigit = [0-9a-fA-F]
|
||||
|
||||
%state PARAMETER,VALUE
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
"[" {
|
||||
yybegin(PARAMETER);
|
||||
if (string != null){
|
||||
String ret = string.toString();
|
||||
string = null;
|
||||
return new ParsedSymbol(SymbolType.TEXT, ret);
|
||||
}
|
||||
}
|
||||
/* escape sequences */
|
||||
"\\[" { if (string == null) string = new StringBuffer(); string.append('['); }
|
||||
"\\]" { if (string == null) string = new StringBuffer(); string.append(']'); }
|
||||
"\\b" { if (string == null) string = new StringBuffer(); string.append('\b'); }
|
||||
"\\t" { if (string == null) string = new StringBuffer(); string.append('\t'); }
|
||||
"\\n" { if (string == null) string = new StringBuffer(); string.append('\n'); }
|
||||
"\\f" { if (string == null) string = new StringBuffer(); string.append('\f'); }
|
||||
"\\r" { if (string == null) string = new StringBuffer(); string.append('\r'); }
|
||||
"\\\"" { if (string == null) string = new StringBuffer(); string.append('\"'); }
|
||||
"\\'" { if (string == null) string = new StringBuffer(); string.append('\''); }
|
||||
"\\\\" { if (string == null) string = new StringBuffer(); string.append('\\'); }
|
||||
\\x{HexDigit}{HexDigit} { char val = (char) Integer.parseInt(yytext().substring(2), 16);
|
||||
string.append(val); }
|
||||
|
||||
/* error cases */
|
||||
\\. { throw new TextParseException("Illegal escape sequence \"" + yytext() + "\"", yyline + 1); }
|
||||
. { if (string == null) string = new StringBuffer(); string.append(yytext()); }
|
||||
<<EOF>> { if (finish) {return null;} else {finish=true; return new ParsedSymbol(SymbolType.TEXT, string == null ? null : string.toString());}}
|
||||
}
|
||||
|
||||
<PARAMETER> {
|
||||
{Divider} {}
|
||||
{Parameter} {
|
||||
parameterName = yytext();
|
||||
yybegin(VALUE);
|
||||
}
|
||||
"]" {
|
||||
yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
|
||||
<VALUE> {
|
||||
{Divider} {}
|
||||
{Value} {
|
||||
yybegin(PARAMETER);
|
||||
return new ParsedSymbol(SymbolType.PARAMETER, new Object[] {parameterName, yytext()});
|
||||
}
|
||||
"]" {
|
||||
yybegin(YYINITIAL);
|
||||
}
|
||||
}
|
||||
|
||||
/* error fallback */
|
||||
[^] { }
|
||||
<<EOF>> { return null; }
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,84 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2010-2014 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.types.annotations.parser;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
%%
|
||||
|
||||
%public
|
||||
%class ConditionLexer
|
||||
%final
|
||||
%unicode
|
||||
%char
|
||||
%line
|
||||
%column
|
||||
%type ConditionToken
|
||||
%throws AnnotationParseException
|
||||
|
||||
%{
|
||||
|
||||
/**
|
||||
* Create an empty lexer, yyrset will be called later to reset and assign
|
||||
* the reader
|
||||
*/
|
||||
public ConditionLexer() {
|
||||
|
||||
}
|
||||
|
||||
public int yychar() {
|
||||
return yychar;
|
||||
}
|
||||
|
||||
public int yyline() {
|
||||
return yyline + 1;
|
||||
}
|
||||
|
||||
private Stack<ConditionToken> pushedBack = new Stack<>();
|
||||
|
||||
public void pushback(ConditionToken symb) {
|
||||
pushedBack.push(symb);
|
||||
}
|
||||
|
||||
public ConditionToken lex() throws java.io.IOException, AnnotationParseException{
|
||||
ConditionToken ret = null;
|
||||
if (!pushedBack.isEmpty()){
|
||||
ret = pushedBack.pop();
|
||||
} else {
|
||||
ret = yylex();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
%}
|
||||
|
||||
Field = [A-Za-z0-9_\.]+
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
{Field} {
|
||||
return new ConditionToken(ConditionTokenType.FIELD, yytext());
|
||||
}
|
||||
"||" | "|" { return new ConditionToken(ConditionTokenType.OR, yytext()); }
|
||||
"&&" | "," | "&" { return new ConditionToken(ConditionTokenType.AND, yytext()); }
|
||||
"!" { return new ConditionToken(ConditionTokenType.NOT, yytext()); }
|
||||
"(" { return new ConditionToken(ConditionTokenType.PARENT_OPEN, yytext()); }
|
||||
")" { return new ConditionToken(ConditionTokenType.PARENT_CLOSE, yytext()); }
|
||||
. { }
|
||||
<<EOF>> {return null;}
|
||||
}
|
||||
Reference in New Issue
Block a user