135 lines
4.9 KiB
Java
135 lines
4.9 KiB
Java
package Common.UI.Themes;
|
||
import org.fife.ui.rsyntaxtextarea.Token;
|
||
|
||
import javax.swing.text.Segment;
|
||
//сткуртура контейнер для всех текущих переменных.
|
||
//для упрощения операций.
|
||
public class TokenProvider {
|
||
public Segment text;
|
||
public char[] array;
|
||
public int offset;
|
||
public int count;
|
||
public int end;
|
||
// Token starting offsets are always of the form:
|
||
// 'startOffset + (currentTokenStart-offset)', but since startOffset and
|
||
// offset are constant, tokens' starting positions become:
|
||
// 'newStartOffset+currentTokenStart'.
|
||
public int newStartOffset;
|
||
public int currentTokenStart;
|
||
public int startTokenType; //хранить тип токена который нам передали, ради переносов
|
||
public int currentTokenType;
|
||
public int i;
|
||
public int position;
|
||
public char c;
|
||
public boolean label_flag;
|
||
public TokenProvider(Segment text_in, int startTokenType_in, int startOffset) {
|
||
text = text_in;
|
||
startTokenType = startTokenType_in; //может указывать на то, что мы продолжаем.
|
||
array = text.array;
|
||
offset = text.offset;
|
||
count = text.count;
|
||
end = offset + count;
|
||
// Token starting offsets are always of the form:
|
||
// 'startOffset + (currentTokenStart-offset)', but since startOffset and
|
||
// offset are constant, tokens' starting positions become:
|
||
// 'newStartOffset+currentTokenStart'.
|
||
newStartOffset = startOffset - offset;
|
||
currentTokenStart = offset;
|
||
currentTokenType = Token.NULL; //изначально не знаем что будем обрабатывать.
|
||
position = 0;
|
||
i = offset;
|
||
label_flag = false;
|
||
}
|
||
public void checkWrap() {
|
||
if (startTokenType != Token.NULL) {
|
||
start();
|
||
startTokenType = Token.NULL;
|
||
}
|
||
}
|
||
public void readNext() {
|
||
c = array[i];
|
||
}
|
||
public void gotoNext() {
|
||
++i;
|
||
++position;
|
||
//todo от греха от табов надо избавляться.
|
||
// возникает расхожедние между реальным и табским смещением. отсюда галюны.
|
||
// лучше бы их не отображать даже если они есть. но это к тексту файла. или как то узнавать их длину..
|
||
}
|
||
public boolean canRead() {
|
||
return i < end;
|
||
}
|
||
public void setType(int currentTokenType_in) {
|
||
currentTokenType = currentTokenType_in;
|
||
}
|
||
public void stop() {
|
||
i = end - 1;
|
||
}
|
||
public void start() {
|
||
currentTokenStart = i;
|
||
}
|
||
//в зоне основной строки
|
||
//по текущему символу определяем тип уже начатого токена.
|
||
public void detectType() {
|
||
switch (c) {
|
||
case ' ':
|
||
case '\t':
|
||
case '\r':
|
||
currentTokenType = Token.WHITESPACE;
|
||
break;
|
||
case '+':
|
||
case '-':
|
||
case '*':
|
||
case '/':
|
||
case '=':
|
||
case '(':
|
||
case ')':
|
||
case '[':
|
||
case ']':
|
||
case '<':
|
||
case '>':
|
||
case '{':
|
||
case '}':
|
||
case ',':
|
||
case '&':
|
||
currentTokenType = Token.OPERATOR;
|
||
break;
|
||
case '\'':
|
||
currentTokenType = Token.LITERAL_CHAR;
|
||
break;
|
||
case '"':
|
||
currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE;
|
||
break;
|
||
case '0':
|
||
case '1':
|
||
case '2':
|
||
case '3':
|
||
case '4':
|
||
case '5':
|
||
case '6':
|
||
case '7':
|
||
case '8':
|
||
case '9':
|
||
currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT;
|
||
break;
|
||
case '.':
|
||
//возможный кандидат на число с плавающей точкой.
|
||
currentTokenType = Token.RESERVED_WORD_2;
|
||
break;
|
||
case '!':
|
||
currentTokenType = Token.COMMENT_EOL;
|
||
stop();
|
||
break;
|
||
default:
|
||
currentTokenType = Token.IDENTIFIER;
|
||
break;
|
||
}
|
||
}
|
||
//досрочный выход из зоны переноса.
|
||
public void SkipWrap() {
|
||
startTokenType = Token.NULL; //перенос исключается.
|
||
position += 6; //гарантированное непопадание в зону переноса при анализе.
|
||
setType(Token.WHITESPACE); //стоит таб, значит переноса не будет. идет набор пробелов.
|
||
}
|
||
}
|