Files
VisualSapfor/src/Common/UI/Themes/TokenProvider.java
2023-09-17 22:13:42 +03:00

135 lines
4.9 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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); //стоит таб, значит переноса не будет. идет набор пробелов.
}
}