feat(gui): smali code highlighting (PR #1283)
* smali code highlighting is basically perfect * Optimize smali highlight color matching, and provide original jflex generation * reformat code * disable checkstyle * update shell to be more environment independent Co-authored-by: Skylot <skylot@gmail.com>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
SmaliTokenMaker.java
|
||||
@@ -0,0 +1,5 @@
|
||||
Refer to the following instructions to modify and use to generate SmaliTokenMarker
|
||||
|
||||
```shell
|
||||
jflex SmaliTokenMaker.flex --skel skeleton.default
|
||||
```
|
||||
@@ -0,0 +1,681 @@
|
||||
/*
|
||||
* Generated on 11/22/21, 8:58 PM
|
||||
*/
|
||||
package jadx.gui.ui.codeearea;
|
||||
|
||||
import java.io.*;
|
||||
import javax.swing.text.Segment;
|
||||
|
||||
import org.fife.ui.rsyntaxtextarea.*;
|
||||
|
||||
|
||||
/**
|
||||
* 用于Smali代码高亮
|
||||
* MartinKay@qq.com
|
||||
*/
|
||||
%%
|
||||
|
||||
%public
|
||||
%class SmaliTokenMaker
|
||||
%extends AbstractJFlexCTokenMaker
|
||||
%unicode
|
||||
/* Case sensitive */
|
||||
%type org.fife.ui.rsyntaxtextarea.Token
|
||||
|
||||
|
||||
%{
|
||||
|
||||
|
||||
/**
|
||||
* Constructor. This must be here because JFlex does not generate a
|
||||
* no-parameter constructor.
|
||||
*/
|
||||
public SmaliTokenMaker() {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addToken(int, int, int)
|
||||
*/
|
||||
private void addHyperlinkToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
*/
|
||||
private void addToken(int tokenType) {
|
||||
addToken(zzStartRead, zzMarkedPos-1, tokenType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param tokenType The token's type.
|
||||
* @see #addHyperlinkToken(int, int, int)
|
||||
*/
|
||||
private void addToken(int start, int end, int tokenType) {
|
||||
int so = start + offsetShift;
|
||||
addToken(zzBuffer, start,end, tokenType, so, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Adds the token specified to the current linked list of tokens.
|
||||
*
|
||||
* @param array The character array.
|
||||
* @param start The starting offset in the array.
|
||||
* @param end The ending offset in the array.
|
||||
* @param tokenType The token's type.
|
||||
* @param startOffset The offset in the document at which this token
|
||||
* occurs.
|
||||
* @param hyperlink Whether this token is a hyperlink.
|
||||
*/
|
||||
public void addToken(char[] array, int start, int end, int tokenType,
|
||||
int startOffset, boolean hyperlink) {
|
||||
super.addToken(array, start,end, tokenType, startOffset, hyperlink);
|
||||
zzStartRead = zzMarkedPos;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public String[] getLineCommentStartAndEnd(int languageIndex) {
|
||||
return new String[] { "#", null };
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the first token in the linked list of tokens generated
|
||||
* from <code>text</code>. This method must be implemented by
|
||||
* subclasses so they can correctly implement syntax highlighting.
|
||||
*
|
||||
* @param text The text from which to get tokens.
|
||||
* @param initialTokenType The token type we should start with.
|
||||
* @param startOffset The offset into the document at which
|
||||
* <code>text</code> starts.
|
||||
* @return The first <code>Token</code> in a linked list representing
|
||||
* the syntax highlighted text.
|
||||
*/
|
||||
public Token getTokenList(Segment text, int initialTokenType, int startOffset) {
|
||||
|
||||
resetTokenList();
|
||||
this.offsetShift = -text.offset + startOffset;
|
||||
|
||||
// Start off in the proper state.
|
||||
int state = Token.NULL;
|
||||
switch (initialTokenType) {
|
||||
/* No multi-line comments */
|
||||
/* No documentation comments */
|
||||
default:
|
||||
state = Token.NULL;
|
||||
}
|
||||
|
||||
s = text;
|
||||
try {
|
||||
yyreset(zzReader);
|
||||
yybegin(state);
|
||||
return yylex();
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
return new TokenImpl();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Refills the input buffer.
|
||||
*
|
||||
* @return <code>true</code> if EOF was reached, otherwise
|
||||
* <code>false</code>.
|
||||
*/
|
||||
private boolean zzRefill() {
|
||||
return zzCurrentPos>=s.offset+s.count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
*
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>YY_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
public final void yyreset(Reader reader) {
|
||||
// 's' has been updated.
|
||||
zzBuffer = s.array;
|
||||
/*
|
||||
* We replaced the line below with the two below it because zzRefill
|
||||
* no longer "refills" the buffer (since the way we do it, it's always
|
||||
* "full" the first time through, since it points to the segment's
|
||||
* array). So, we assign zzEndRead here.
|
||||
*/
|
||||
//zzStartRead = zzEndRead = s.offset;
|
||||
zzStartRead = s.offset;
|
||||
zzEndRead = zzStartRead + s.count - 1;
|
||||
zzCurrentPos = zzMarkedPos = zzPushbackPos = s.offset;
|
||||
zzLexicalState = YYINITIAL;
|
||||
zzReader = reader;
|
||||
zzAtBOL = true;
|
||||
zzAtEOF = false;
|
||||
}
|
||||
|
||||
|
||||
%}
|
||||
|
||||
Letter = [A-Za-z]
|
||||
LetterOrUnderscore = ({Letter}|"_")
|
||||
NonzeroDigit = [1-9]
|
||||
Digit = ("0"|{NonzeroDigit})
|
||||
HexDigit = ({Digit}|[A-Fa-f])
|
||||
OctalDigit = ([0-7])
|
||||
AnyCharacterButApostropheOrBackSlash = ([^\\'])
|
||||
AnyCharacterButDoubleQuoteOrBackSlash = ([^\\\"\n])
|
||||
EscapedSourceCharacter = ("u"{HexDigit}{HexDigit}{HexDigit}{HexDigit})
|
||||
Escape = ("\\"(([btnfr\"'\\])|([0123]{OctalDigit}?{OctalDigit}?)|({OctalDigit}{OctalDigit}?)|{EscapedSourceCharacter}))
|
||||
NonSeparator = ([^\t\f\r\n\ \(\)\{\}\[\]\;\,\.\=\>\<\!\~\?\:\+\-\*\/\&\|\^\%\"\']|"#"|"\\")
|
||||
IdentifierStart = ({LetterOrUnderscore}|"$")
|
||||
IdentifierPart = ({IdentifierStart}|{Digit}|("\\"{EscapedSourceCharacter}))
|
||||
|
||||
LineTerminator = (\n)
|
||||
WhiteSpace = ([ \t\f]+)
|
||||
|
||||
CharLiteral = ([\']({AnyCharacterButApostropheOrBackSlash}|{Escape})[\'])
|
||||
UnclosedCharLiteral = ([\'][^\'\n]*)
|
||||
ErrorCharLiteral = ({UnclosedCharLiteral}[\'])
|
||||
StringLiteral = ([\"]({AnyCharacterButDoubleQuoteOrBackSlash}|{Escape})*[\"])
|
||||
UnclosedStringLiteral = ([\"]([\\].|[^\\\"])*[^\"]?)
|
||||
ErrorStringLiteral = ({UnclosedStringLiteral}[\"])
|
||||
|
||||
/* No multi-line comments */
|
||||
/* No documentation comments */
|
||||
LineCommentBegin = "#"
|
||||
|
||||
IntegerLiteral = ({Digit}+)
|
||||
HexLiteral = (0x{HexDigit}+)
|
||||
FloatLiteral = (({Digit}+)("."{Digit}+)?(e[+-]?{Digit}+)? | ({Digit}+)?("."{Digit}+)(e[+-]?{Digit}+)?)
|
||||
ErrorNumberFormat = (({IntegerLiteral}|{HexLiteral}|{FloatLiteral}){NonSeparator}+)
|
||||
BooleanLiteral = ("true"|"false")
|
||||
|
||||
Separator = ([\(\)\{\}\[\]])
|
||||
Separator2 = ([\;,.])
|
||||
|
||||
Identifier = ({IdentifierStart}{IdentifierPart}*)
|
||||
|
||||
URLGenDelim = ([:\/\?#\[\]@])
|
||||
URLSubDelim = ([\!\$&'\(\)\*\+,;=])
|
||||
URLUnreserved = ({LetterOrUnderscore}|{Digit}|[\-\.\~])
|
||||
URLCharacter = ({URLGenDelim}|{URLSubDelim}|{URLUnreserved}|[%])
|
||||
URLCharacters = ({URLCharacter}*)
|
||||
URLEndCharacter = ([\/\$]|{Letter}|{Digit})
|
||||
URL = (((https?|f(tp|ile))"://"|"www.")({URLCharacters}{URLEndCharacter})?)
|
||||
|
||||
|
||||
/* Custom Regex */
|
||||
/* fully-qualified name Rules */
|
||||
SimpleName = ([a-zA-Z0-9_$]*)
|
||||
QUALIFIED_TYPE_NAME = ("L"({SimpleName}{SLASH})*{SimpleName}*";")
|
||||
/* Types */
|
||||
VOID_TYPE = ("V")
|
||||
BOOLEAN_TYPE = ("Z")
|
||||
BYTE_TYPE = ("B")
|
||||
SHORT_TYPE = ("S")
|
||||
CHAR_TYPE = ("C")
|
||||
INT_TYPE = ("I")
|
||||
LONG_TYPE = ("J")
|
||||
FLOAT_TYPE = ("F")
|
||||
DOUBLE_TYPE = ("D")
|
||||
/* Multi Args Types Highlight */
|
||||
MULTI_ARGS_TYPES = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+);
|
||||
|
||||
/* Types fully-qualified name */
|
||||
COMPOUND_METHOD_ARG_LITERAL = (({BOOLEAN_TYPE}|{BYTE_TYPE}|{SHORT_TYPE}|{CHAR_TYPE}|{INT_TYPE}|{LONG_TYPE}|{FLOAT_TYPE}|{DOUBLE_TYPE})+{QUALIFIED_TYPE_NAME})
|
||||
|
||||
|
||||
LBRACK = ("[")
|
||||
RBRACK = ("]")
|
||||
LPAREN = ("(")
|
||||
RPAREN = (")")
|
||||
LBRACE = ("{")
|
||||
RBRACE = ("}")
|
||||
COLON = (":")
|
||||
ASSIGN = ("=")
|
||||
DOT = (".")
|
||||
SUB = ("-")
|
||||
COMMA = (",")
|
||||
SLASH = ("/")
|
||||
LT = ("<")
|
||||
GT = (">")
|
||||
ARROW = ("->")
|
||||
SEMI = (";")
|
||||
ARROW_FUNCTION = ({ARROW}[a-zA-Z_$<>]*)
|
||||
CustomSeparator = ({Separator}|{ARROW_FUNCTION})
|
||||
|
||||
/* Register */
|
||||
VREGISTER = ("v"("0"|[1-9])*)
|
||||
PREGISTER = ("p"("0"|[1-9])*)
|
||||
|
||||
/* Flags */
|
||||
FLAG_PSWITCH = (":pswitch_"{SimpleName})
|
||||
FLAG_PSWITCH_DATA = (":pswitch_data_"{SimpleName})
|
||||
FLAG_GOTO = (":goto_"{SimpleName})
|
||||
FLAG_COND = (":cond_"{SimpleName})
|
||||
FLAG_TRY_START = (":try_start_"{SimpleName})
|
||||
FLAG_TRY_END = (":try_end_"{SimpleName})
|
||||
FLAG_CATCH = (":catch_"{SimpleName})
|
||||
FLAG_CATCHALL = (":catchall_"{SimpleName})
|
||||
FLAG_ARRAY = (":array_"{SimpleName})
|
||||
|
||||
/* No string state */
|
||||
/* No char state */
|
||||
/* No MLC state */
|
||||
/* No documentation comment state */
|
||||
%state EOL_COMMENT
|
||||
|
||||
%%
|
||||
|
||||
<YYINITIAL> {
|
||||
|
||||
/* Keywords Instructions Highlight */
|
||||
"nop" |
|
||||
"move" |
|
||||
"move/from16" |
|
||||
"move/16" |
|
||||
"move-wide" |
|
||||
"move-wide/from16" |
|
||||
"move-wide/16" |
|
||||
"move-object" |
|
||||
"move-object/from16" |
|
||||
"move-object/16" |
|
||||
"move-result" |
|
||||
"move-result-wide" |
|
||||
"move-result-object" |
|
||||
"move-exception" |
|
||||
"return-void" |
|
||||
"return" |
|
||||
"return-wide" |
|
||||
"return-object" |
|
||||
"const/4" |
|
||||
"const/16" |
|
||||
"const" |
|
||||
"const/high16" |
|
||||
"const-wide/16" |
|
||||
"const-wide/32" |
|
||||
"const-wide" |
|
||||
"const-wide/high16" |
|
||||
"const-string" |
|
||||
"const-string/jumbo" |
|
||||
"const-class" |
|
||||
"monitor-enter" |
|
||||
"monitor-exit" |
|
||||
"check-cast" |
|
||||
"instance-of" |
|
||||
"array-length" |
|
||||
"new-instance" |
|
||||
"new-array" |
|
||||
"filled-new-array" |
|
||||
"filled-new-array/range" |
|
||||
"fill-array-data" |
|
||||
"throw" |
|
||||
"goto" |
|
||||
"goto/16" |
|
||||
"goto/32" |
|
||||
"cmpl-float" |
|
||||
"cmpg-float" |
|
||||
"cmpl-double" |
|
||||
"cmpg-double" |
|
||||
"cmp-long" |
|
||||
"if-eq" |
|
||||
"if-ne" |
|
||||
"if-lt" |
|
||||
"if-ge" |
|
||||
"if-gt" |
|
||||
"if-le" |
|
||||
"if-eqz" |
|
||||
"if-nez" |
|
||||
"if-ltz" |
|
||||
"if-gez" |
|
||||
"if-gtz" |
|
||||
"if-lez" |
|
||||
"aget" |
|
||||
"aget-wide" |
|
||||
"aget-object" |
|
||||
"aget-boolean" |
|
||||
"aget-byte" |
|
||||
"aget-char" |
|
||||
"aget-short" |
|
||||
"aput" |
|
||||
"aput-wide" |
|
||||
"aput-object" |
|
||||
"aput-boolean" |
|
||||
"aput-byte" |
|
||||
"aput-char" |
|
||||
"aput-short" |
|
||||
"iget" |
|
||||
"iget-wide" |
|
||||
"iget-object" |
|
||||
"iget-boolean" |
|
||||
"iget-byte" |
|
||||
"iget-char" |
|
||||
"iget-short" |
|
||||
"iput" |
|
||||
"iput-wide" |
|
||||
"iput-object" |
|
||||
"iput-boolean" |
|
||||
"iput-byte" |
|
||||
"iput-char" |
|
||||
"iput-short" |
|
||||
"sget" |
|
||||
"sget-wide" |
|
||||
"sget-object" |
|
||||
"sget-boolean" |
|
||||
"sget-byte" |
|
||||
"sget-char" |
|
||||
"sget-short" |
|
||||
"sput" |
|
||||
"sput-wide" |
|
||||
"sput-object" |
|
||||
"sput-boolean" |
|
||||
"sput-byte" |
|
||||
"sput-char" |
|
||||
"sput-short" |
|
||||
"invoke-virtual" |
|
||||
"invoke-super" |
|
||||
"invoke-direct" |
|
||||
"invoke-static" |
|
||||
"invoke-interface" |
|
||||
"invoke-virtual/range" |
|
||||
"invoke-super/range" |
|
||||
"invoke-direct/range" |
|
||||
"invoke-static/range" |
|
||||
"invoke-interface/range" |
|
||||
"neg-int" |
|
||||
"not-int" |
|
||||
"neg-long" |
|
||||
"not-long" |
|
||||
"neg-float" |
|
||||
"neg-double" |
|
||||
"int-to-long" |
|
||||
"int-to-float" |
|
||||
"int-to-double" |
|
||||
"long-to-int" |
|
||||
"long-to-float" |
|
||||
"long-to-double" |
|
||||
"float-to-int" |
|
||||
"float-to-long" |
|
||||
"float-to-double" |
|
||||
"double-to-int" |
|
||||
"double-to-long" |
|
||||
"double-to-float" |
|
||||
"int-to-byte" |
|
||||
"int-to-char" |
|
||||
"int-to-short" |
|
||||
"add-int" |
|
||||
"sub-int" |
|
||||
"mul-int" |
|
||||
"div-int" |
|
||||
"rem-int" |
|
||||
"and-int" |
|
||||
"or-int" |
|
||||
"xor-int" |
|
||||
"shl-int" |
|
||||
"shr-int" |
|
||||
"ushr-int" |
|
||||
"add-long" |
|
||||
"sub-long" |
|
||||
"mul-long" |
|
||||
"div-long" |
|
||||
"rem-long" |
|
||||
"and-long" |
|
||||
"or-long" |
|
||||
"xor-long" |
|
||||
"shl-long" |
|
||||
"shr-long" |
|
||||
"ushr-long" |
|
||||
"add-float" |
|
||||
"sub-float" |
|
||||
"mul-float" |
|
||||
"div-float" |
|
||||
"rem-float" |
|
||||
"add-double" |
|
||||
"sub-double" |
|
||||
"mul-double" |
|
||||
"div-double" |
|
||||
"rem-double" |
|
||||
"add-int/2addr" |
|
||||
"sub-int/2addr" |
|
||||
"mul-int/2addr" |
|
||||
"div-int/2addr" |
|
||||
"rem-int/2addr" |
|
||||
"and-int/2addr" |
|
||||
"or-int/2addr" |
|
||||
"xor-int/2addr" |
|
||||
"shl-int/2addr" |
|
||||
"shr-int/2addr" |
|
||||
"ushr-int/2addr" |
|
||||
"add-long/2addr" |
|
||||
"sub-long/2addr" |
|
||||
"mul-long/2addr" |
|
||||
"div-long/2addr" |
|
||||
"rem-long/2addr" |
|
||||
"and-long/2addr" |
|
||||
"or-long/2addr" |
|
||||
"xor-long/2addr" |
|
||||
"shl-long/2addr" |
|
||||
"shr-long/2addr" |
|
||||
"ushr-long/2addr" |
|
||||
"add-float/2addr" |
|
||||
"sub-float/2addr" |
|
||||
"mul-float/2addr" |
|
||||
"div-float/2addr" |
|
||||
"rem-float/2addr" |
|
||||
"add-double/2addr" |
|
||||
"sub-double/2addr" |
|
||||
"mul-double/2addr" |
|
||||
"div-double/2addr" |
|
||||
"rem-double/2addr" |
|
||||
"add-int/lit16" |
|
||||
"rsub-int" |
|
||||
"mul-int/lit16" |
|
||||
"div-int/lit16" |
|
||||
"rem-int/lit16" |
|
||||
"and-int/lit16" |
|
||||
"or-int/lit16" |
|
||||
"xor-int/lit16" |
|
||||
"add-int/lit8" |
|
||||
"rsub-int/lit8" |
|
||||
"mul-int/lit8" |
|
||||
"div-int/lit8" |
|
||||
"rem-int/lit8" |
|
||||
"and-int/lit8" |
|
||||
"or-int/lit8" |
|
||||
"xor-int/lit8" |
|
||||
"shl-int/lit8" |
|
||||
"shr-int/lit8" |
|
||||
"ushr-int/lit8" |
|
||||
"invoke-polymorphic" |
|
||||
"invoke-polymorphic/range" |
|
||||
"invoke-custom" |
|
||||
"invoke-custom/range" |
|
||||
"const-method-handle" |
|
||||
"const-method-type" |
|
||||
"packed-switch" |
|
||||
"sparse-switch" { addToken(Token.FUNCTION); }
|
||||
|
||||
/* Keywords Modifiers(IDENTIFIER标识符、修饰符) Highlight */
|
||||
"public" |
|
||||
"private" |
|
||||
"protected" |
|
||||
"final" |
|
||||
"annotation" |
|
||||
"static" |
|
||||
"synthetic" |
|
||||
"constructor" |
|
||||
"abstract" |
|
||||
"enum" |
|
||||
"interface" |
|
||||
"transient" |
|
||||
"bridge" |
|
||||
"declared-synchronized" |
|
||||
"volatile" |
|
||||
"strictfp" |
|
||||
"varargs" |
|
||||
"native" { addToken(Token.RESERVED_WORD); }
|
||||
|
||||
|
||||
|
||||
|
||||
/* Keywords Directives Highlight */
|
||||
".method" |
|
||||
".end method" |
|
||||
".implements" |
|
||||
".class" |
|
||||
".prologue" |
|
||||
".source" |
|
||||
".super" |
|
||||
".field" |
|
||||
".end field" |
|
||||
".registers" |
|
||||
".locals" |
|
||||
".param" |
|
||||
".line" |
|
||||
".catch" |
|
||||
".catchall" |
|
||||
".annotation" |
|
||||
".end annotation" |
|
||||
".local" |
|
||||
".end local" |
|
||||
".restart local" |
|
||||
".packed-switch" |
|
||||
".end packed-switch" |
|
||||
".array-data" |
|
||||
".end array-data" |
|
||||
".sparse-switch" |
|
||||
".end sparse-switch" |
|
||||
".end param" { addToken(Token.RESERVED_WORD_2); }
|
||||
|
||||
|
||||
/* VARIABLE Register Highlight */
|
||||
{VREGISTER} |
|
||||
{PREGISTER} { addToken(Token.VARIABLE); }
|
||||
|
||||
|
||||
|
||||
/* Data types Highlight */
|
||||
{QUALIFIED_TYPE_NAME} |
|
||||
{COMPOUND_METHOD_ARG_LITERAL} |
|
||||
{MULTI_ARGS_TYPES} |
|
||||
{QUALIFIED_TYPE_NAME} |
|
||||
{VOID_TYPE} |
|
||||
{BOOLEAN_TYPE} |
|
||||
{BYTE_TYPE} |
|
||||
{SHORT_TYPE} |
|
||||
{CHAR_TYPE} |
|
||||
{INT_TYPE} |
|
||||
{LONG_TYPE} |
|
||||
{FLOAT_TYPE} |
|
||||
{DOUBLE_TYPE} { addToken(Token.DATA_TYPE); }
|
||||
|
||||
/* FLAGS */
|
||||
{FLAG_PSWITCH} |
|
||||
{FLAG_PSWITCH_DATA} |
|
||||
{FLAG_GOTO} |
|
||||
{FLAG_COND} |
|
||||
{FLAG_TRY_START} |
|
||||
{FLAG_TRY_END} |
|
||||
{FLAG_CATCHALL} |
|
||||
{FLAG_ARRAY} |
|
||||
{FLAG_CATCH} { addToken(Token.MARKUP_TAG_NAME); }
|
||||
|
||||
/* Functions */
|
||||
/* No functions */
|
||||
|
||||
{BooleanLiteral} { addToken(Token.LITERAL_BOOLEAN); }
|
||||
|
||||
{LineTerminator} { addNullToken(); return firstToken; }
|
||||
|
||||
{Identifier} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
{WhiteSpace} { addToken(Token.WHITESPACE); }
|
||||
|
||||
/* String/Character literals. */
|
||||
{CharLiteral} { addToken(Token.LITERAL_CHAR); }
|
||||
{UnclosedCharLiteral} { addToken(Token.ERROR_CHAR); addNullToken(); return firstToken; }
|
||||
{ErrorCharLiteral} { addToken(Token.ERROR_CHAR); }
|
||||
{StringLiteral} { addToken(Token.LITERAL_STRING_DOUBLE_QUOTE); }
|
||||
{UnclosedStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); addNullToken(); return firstToken; }
|
||||
{ErrorStringLiteral} { addToken(Token.ERROR_STRING_DOUBLE); }
|
||||
|
||||
/* Comment literals. */
|
||||
/* No multi-line comments */
|
||||
/* No documentation comments */
|
||||
{LineCommentBegin} { start = zzMarkedPos-1; yybegin(EOL_COMMENT); }
|
||||
|
||||
/* Separators. */
|
||||
{CustomSeparator} { addToken(Token.SEPARATOR); }
|
||||
{Separator2} { addToken(Token.IDENTIFIER); }
|
||||
|
||||
/* Operators. */
|
||||
"!" |
|
||||
";" |
|
||||
"." |
|
||||
"=" |
|
||||
"/" |
|
||||
"'" |
|
||||
"(" |
|
||||
")" |
|
||||
"," |
|
||||
"->" |
|
||||
";->" |
|
||||
"<" |
|
||||
">" |
|
||||
"@" |
|
||||
"[" |
|
||||
"]" |
|
||||
"{" |
|
||||
"}" { addToken(Token.OPERATOR); }
|
||||
|
||||
/* Numbers */
|
||||
{IntegerLiteral} { addToken(Token.LITERAL_NUMBER_DECIMAL_INT); }
|
||||
{HexLiteral} { addToken(Token.LITERAL_NUMBER_HEXADECIMAL); }
|
||||
{FloatLiteral} { addToken(Token.LITERAL_NUMBER_FLOAT); }
|
||||
{ErrorNumberFormat} { addToken(Token.ERROR_NUMBER_FORMAT); }
|
||||
|
||||
/* Ended with a line not in a string or comment. */
|
||||
<<EOF>> { addNullToken(); return firstToken; }
|
||||
|
||||
/* Catch any other (unhandled) characters. */
|
||||
. { addToken(Token.IDENTIFIER); }
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* No char state */
|
||||
|
||||
/* No string state */
|
||||
|
||||
/* No multi-line comment state */
|
||||
|
||||
/* No documentation comment state */
|
||||
|
||||
<EOL_COMMENT> {
|
||||
[^hwf\n]+ {}
|
||||
{URL} { int temp=zzStartRead; addToken(start,zzStartRead-1, Token.COMMENT_EOL); addHyperlinkToken(temp,zzMarkedPos-1, Token.COMMENT_EOL); start = zzMarkedPos; }
|
||||
[hwf] {}
|
||||
\n { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
<<EOF>> { addToken(start,zzStartRead-1, Token.COMMENT_EOL); addNullToken(); return firstToken; }
|
||||
}
|
||||
|
||||
@@ -0,0 +1,243 @@
|
||||
|
||||
/** This character denotes the end of file */
|
||||
public static final int YYEOF = -1;
|
||||
|
||||
/** initial size of the lookahead buffer */
|
||||
--- private static final int ZZ_BUFFERSIZE = ...;
|
||||
|
||||
/** lexical states */
|
||||
--- lexical states, charmap
|
||||
|
||||
/* error codes */
|
||||
private static final int ZZ_UNKNOWN_ERROR = 0;
|
||||
private static final int ZZ_NO_MATCH = 1;
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
|
||||
/* error messages for the codes above */
|
||||
private static final String ZZ_ERROR_MSG[] = {
|
||||
"Unkown internal scanner error",
|
||||
"Error: could not match input",
|
||||
"Error: pushback value was too large"
|
||||
};
|
||||
|
||||
--- isFinal list
|
||||
/** the input device */
|
||||
private java.io.Reader zzReader;
|
||||
|
||||
/** the current state of the DFA */
|
||||
private int zzState;
|
||||
|
||||
/** the current lexical state */
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
|
||||
/** this buffer contains the current text to be matched and is
|
||||
the source of the yytext() string */
|
||||
private char zzBuffer[];
|
||||
|
||||
/** the textposition at the last accepting state */
|
||||
private int zzMarkedPos;
|
||||
|
||||
/** the textposition at the last state to be included in yytext */
|
||||
private int zzPushbackPos;
|
||||
|
||||
/** the current text position in the buffer */
|
||||
private int zzCurrentPos;
|
||||
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
private int zzStartRead;
|
||||
|
||||
/** endRead marks the last character in the buffer, that has been read
|
||||
from input */
|
||||
private int zzEndRead;
|
||||
|
||||
/** number of newlines encountered up to the start of the matched text */
|
||||
private int yyline;
|
||||
|
||||
/** the number of characters up to the start of the matched text */
|
||||
private int yychar;
|
||||
|
||||
/**
|
||||
* the number of characters from the last newline up to the start of the
|
||||
* matched text
|
||||
*/
|
||||
private int yycolumn;
|
||||
|
||||
/**
|
||||
* zzAtBOL == true <=> the scanner is currently at the beginning of a line
|
||||
*/
|
||||
private boolean zzAtBOL = true;
|
||||
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
private boolean zzAtEOF;
|
||||
|
||||
--- user class code
|
||||
|
||||
/**
|
||||
* Creates a new scanner
|
||||
* There is also a java.io.InputStream version of this constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
--- constructor declaration
|
||||
|
||||
|
||||
/**
|
||||
* Closes the input stream.
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true; /* indicate end of file */
|
||||
zzEndRead = zzStartRead; /* invalidate buffer */
|
||||
|
||||
if (zzReader != null)
|
||||
zzReader.close();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Enters a new lexical state
|
||||
*
|
||||
* @param newState the new lexical state
|
||||
*/
|
||||
public final void yybegin(int newState) {
|
||||
zzLexicalState = newState;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the text matched by the current regular expression.
|
||||
*/
|
||||
public final String yytext() {
|
||||
return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the
|
||||
* matched text.
|
||||
*
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch.
|
||||
* A value from 0 to yylength()-1.
|
||||
*
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
return zzBuffer[zzStartRead+pos];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the length of the matched text region.
|
||||
*/
|
||||
public final int yylength() {
|
||||
return zzMarkedPos-zzStartRead;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
*
|
||||
* In a wellformed scanner (no or only correct usage of
|
||||
* yypushback(int) and a match-all fallback rule) this method
|
||||
* will only be called with things that "Can't Possibly Happen".
|
||||
* If this method is called, something is seriously wrong
|
||||
* (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
*
|
||||
* Usual syntax/scanner level error handling should be done
|
||||
* in error fallback rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
--- zzScanError declaration
|
||||
String message;
|
||||
try {
|
||||
message = ZZ_ERROR_MSG[errorCode];
|
||||
}
|
||||
catch (ArrayIndexOutOfBoundsException e) {
|
||||
message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR];
|
||||
}
|
||||
|
||||
--- throws clause
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
*
|
||||
* They will be read again by then next call of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again.
|
||||
* This number must not be greater than yylength()!
|
||||
*/
|
||||
--- yypushback decl (contains zzScanError exception)
|
||||
if ( number > yylength() )
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
|
||||
--- zzDoEOF
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched,
|
||||
* the end of input is encountered or an I/O-Error occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @exception java.io.IOException if any I/O-Error occurs
|
||||
*/
|
||||
--- yylex declaration
|
||||
int zzInput;
|
||||
int zzAction;
|
||||
|
||||
// cached fields:
|
||||
int zzCurrentPosL;
|
||||
int zzMarkedPosL;
|
||||
int zzEndReadL = zzEndRead;
|
||||
char [] zzBufferL = zzBuffer;
|
||||
char [] zzCMapL = ZZ_CMAP;
|
||||
|
||||
--- local declarations
|
||||
|
||||
while (true) {
|
||||
zzMarkedPosL = zzMarkedPos;
|
||||
|
||||
--- start admin (line, char, col count)
|
||||
zzAction = -1;
|
||||
|
||||
zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
|
||||
|
||||
--- start admin (lexstate etc)
|
||||
|
||||
zzForAction: {
|
||||
while (true) {
|
||||
|
||||
--- next input, line, col, char count, next transition, isFinal action
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
--- line count update
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
--- char count update
|
||||
|
||||
--- actions
|
||||
default:
|
||||
if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
|
||||
zzAtEOF = true;
|
||||
--- eofvalue
|
||||
}
|
||||
else {
|
||||
--- no match
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
--- main
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user