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;
      }
   }
}