CharacterSequenceMatcher class
Пакет: com.hypixel.hytale.server.npc.util.expression.compile
Файл: com/hypixel/hytale/server/npc/util/expression/compile/Lexer.java
Поля (12)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public List<Lexer.CharacterSequenceMatcher<T>> |
children |
|
public char |
letter |
|
public T |
token |
|
int |
var2 |
|
Lexer.CharacterSequenceMatcher |
var4 |
|
char |
var5 |
|
char |
var5 |
|
int |
var6 |
|
Lexer.CharacterSequenceMatcher |
var6 |
|
int |
var7 |
|
Lexer.CharacterSequenceMatcher |
var8 |
|
Lexer.CharacterSequenceMatcher |
var9 |
Методы (16)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException("Duplicate operator " + var3) |
|
private void |
addTailprivate void addTail(T var1, int var2, @Nonnull String var3, int var4, @Nonnull Lexer.CharacterSequenceMatcher<T> var5) |
|
protected void |
addTokenprotected void addToken(T var1, int var2, @Nonnull String var3, int var4) |
|
protected void |
addTokenprotected void addToken(T var1, @Nonnull String var2) |
|
private void |
appendprivate void append(T var1, int var2, @Nonnull String var3, int var4, char var5) |
abstract |
|
for for(int var3 = this.children.size() |
|
|
if if(this.children == null) |
|
|
if if(var6 == var7) |
|
|
if if(var8.letter == var5) |
|
|
if if(var2 == var4) |
|
|
if if(var8.token != null) |
|
|
if if(var2 == var4) |
|
|
if if(this.children != null) |
|
|
if if(var5 == var1) |
|
|
if if(var5 > var1) |
|
protected Lexer.CharacterSequenceMatcher<T> |
matchLetterprotected Lexer.CharacterSequenceMatcher<T> matchLetter(char var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.util.expression.compile;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.text.ParseException;
class="kw">import java.util.List;
class="kw">import java.util.function.Supplier;
class="kw">import java.util.stream.Stream;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class Lexer<T class="kw">extends Supplier<String>> {
class="kw">public class="kw">static class="kw">final String UNTERMINATED_STRING = "Unterminated string";
class="kw">public class="kw">static class="kw">final String INVALID_NUMBER_FORMAT = "Invalid number format";
class="kw">public class="kw">static class="kw">final String INVALID_CHARACTER_IN_EXPRESSION = "Invalid character in expression :";
class="kw">private class="kw">final T tokenEnd;
class="kw">private class="kw">final T tokenIdent;
class="kw">private class="kw">final T tokenString;
class="kw">private class="kw">final T tokenNumber;
class="kw">private class="kw">final Lexer.CharacterSequenceMatcher<T> characterSequenceMatcher;
class="kw">public Lexer(T var1, T var2, T var3, T var4, @Nonnull Stream<T> var5) {
this.tokenEnd = var1;
this.tokenIdent = var2;
this.tokenString = var3;
this.tokenNumber = var4;
this.characterSequenceMatcher = new Lexer.CharacterSequenceMatcher<>();
var5.forEach(var1x -> this.characterSequenceMatcher.addToken((T)var1x, var1x.get()));
}
class="kw">public T nextToken(@Nonnull LexerContext<T> var1) class="kw">throws ParseException {
var1.resetToken();
if (!var1.eatWhiteSpace()) {
class="kw">return var1.setToken(this.tokenEnd);
}
char var2 = var1.currentChar();
if (Character.isLetter(var2) || var2 == '_') {
var1.parseIdent(var2);
class="kw">return var1.setToken(this.tokenIdent);
}
if (var1.isNumber(var2)) {
var1.parseNumber(var2);
class="kw">return var1.setToken(this.tokenNumber);
}
if (var2 != '"' && var2 != '\'') {
Lexer.CharacterSequenceMatcher var3 = null;
Lexer.CharacterSequenceMatcher var4 = this.characterSequenceMatcher.matchLetter(var2);
int var5 = var1.getPosition();
while (var4 != null) {
if (var4.token != null) {
var5 = var1.getPosition();
var3 = var4;
}
var2 = var1.addTokenCharacter(var2);
if (!var1.haveChar()) {
break;
}
var4 = var4.matchLetter(var2);
}
if (var3 != null) {
var1.adjustPosition(var5 + 1);
class="kw">return var1.setToken(var3.token);
} else {
throw new ParseException("Invalid character in expression :" + var2, var1.getTokenPosition());
}
} else {
var1.parseString(var2);
class="kw">return var1.setToken(this.tokenString);
}
}
class="kw">protected class="kw">static class CharacterSequenceMatcher<T> {
@Nullable
class="kw">public T token = (T)null;
class="kw">public char letter;
@Nullable
class="kw">public List<Lexer.CharacterSequenceMatcher<T>> children;
class="kw">public CharacterSequenceMatcher() {
this.letter = 0;
this.children = null;
}
class="kw">public CharacterSequenceMatcher(char var1) {
this.letter = var1;
this.children = null;
}
class="kw">protected void addToken(T var1, int var2, @Nonnull String var3, int var4) {
char var5 = var3.charAt(var2);
if (this.children == null) {
this.children = new ObjectArrayList();
this.append(var1, var2, var3, var4, var5);
} else {
int var6 = 0;
int var7 = this.children.size();
while (var6 < var7 && this.children.get(var6).letter < var5) {
var6++;
}
if (var6 == var7) {
this.append(var1, var2, var3, var4, var5);
} else {
Lexer.CharacterSequenceMatcher var8 = this.children.get(var6);
if (var8.letter == var5) {
if (var2 == var4) {
if (var8.token != null) {
throw new RuntimeException("Duplicate operator " + var3);
}
var8.token = var1;
} else {
var8.addToken(var1, var2 + 1, var3, var4);
}
} else {
Lexer.CharacterSequenceMatcher var9 = new Lexer.CharacterSequenceMatcher<>(var5);
this.children.add(var6, var9);
this.addTail(var1, var2, var3, var4, var9);
}
}
}
}
class="kw">protected void addToken(T var1, @Nonnull String var2) {
this.addToken(var1, 0, var2, var2.length() - 1);
}
class="kw">private void append(T var1, int var2, @Nonnull String var3, int var4, char var5) {
Lexer.CharacterSequenceMatcher var6 = new Lexer.CharacterSequenceMatcher<>(var5);
this.children.add(var6);
this.addTail(var1, var2, var3, var4, var6);
}
class="kw">private void addTail(T var1, int var2, @Nonnull String var3, int var4, @Nonnull Lexer.CharacterSequenceMatcher<T> var5) {
if (var2 == var4) {
var5.token = var1;
} else {
var5.addToken(var1, var2 + 1, var3, var4);
}
}
@Nullable
class="kw">protected Lexer.CharacterSequenceMatcher<T> matchLetter(char var1) {
if (this.children != null) {
int var2 = 0;
for (int var3 = this.children.size(); var2 < var3; var2++) {
Lexer.CharacterSequenceMatcher var4 = this.children.get(var2);
char var5 = var4.letter;
if (var5 == var1) {
class="kw">return var4;
}
if (var5 > var1) {
class="kw">return null;
}
}
}
class="kw">return null;
}
}
}