構文解析のやつ

みなさまお久しぶりでございます。
アドオンシリーズは更新していません()
また機会があれば更新しようかと思います(投げやり)

とりあえず自分用メモ
```java:Lexer.java
public class Lexer {
    private static final ArrayList<String> list = new ArrayList<>(); // 結果
    // 検知する文字とか
    private static final List<Character> brackets = Arrays.asList('(',')','{','}','[',']');
    private static final List<Character> operators = Arrays.asList('=','+','-','*','/');
    private static final List<Character> strings = Arrays.asList('\'','"');
    private static final List<Character> splits = Arrays.asList(',', ';');

    private static String s = "";
    private static boolean isString = false; // 文字列が始まったかどうか
    private static char startString = ' '; // 文字展開の最初に",'の二種類あるので"で始まったが'で終わらないようにするための対策

    private static Type getType(final Character c){ // タイプ判定。ここのクラスTypeは後述。
        if(Character.isLetter(c)) return Type.alphabet;
        else if(Character.isDigit(c)) return Type.digit;
        else if(Character.isWhitespace(c)) return Type.space;
        else if(operators.contains(c)) return Type.operator;
        else if(brackets.contains(c)) return Type.bracket;
        else if(strings.contains(c)) return Type.string;
        else if(splits.contains(c)) return Type.split;
        return Type.other;
    }

    public static void analyze(char c){
        Type type = getType(c);
        if(!isString){ // 文字列内ではない
            if(type.equals(Type.other)){
                System.out.println("その文字は使用不可能です: " + c);
                return;
            }
            if(type.equals(Type.alphabet)){
                s += c;
            } else if(type.equals(Type.digit)){
                s += c;
            }else if(type.equals(Type.space)){
                if(!s.equals("")) {
                    list.add(s);
                }
                s = "";
            }else if(type.equals(Type.operator)){
                if(!s.equals("")) {
                    list.add(s);
                }
                s = "";
                s += c;
                list.add(s);
                s = "";
            }else if(type.equals(Type.bracket)){
                if(!s.equals("")) {
                    list.add(s);
                }
                s = "";
                s += c;
                list.add(s);
                s = "";
            }else if(type.equals(Type.split)){
                if(!s.equals("")) {
                    list.add(s);
                }
                s = "";
                s += c;
                list.add(s);
                s = "";
            }else if(type.equals(Type.string)){
                if(!s.equals("")) {
                    list.add(s);
                }
                s = "";
                s += c;
                list.add(s);
                s = "";
                startString = c;
                isString = true;
            }
        }else{ // 文字列内の処理
            if(c == startString){ // 文字列の終端
                if(!s.equals("")) {
                    list.add(s);
                }
                s = "";
                s += c;
                list.add(s);
                s = "";
                startString = ' ';
                isString = false;
            }else{
                s += c; // 文字列内なら何も気にせず増やす
            }
        }
    }

    public static void endAnalyze(){ // 最後残ったやつを追加
        if(!s.equals("")) {
            list.add(s);
            s = "";
        }
    }
    
    public static void listRefresh(){ // 初期化
        list.clear(); // リスト削除
        s = ""; // ためておいた文字列消去
        isString = false; // 文字列の外判定にする
        startString = ' '; // 文字列の外判定なので初期化
    }

    public static ArrayList<String> getList(){ // リストがprivateなので
        return list;
    }
}
```

Type.javaも記述。
たった数行

```java:Type.java
public enum Type {
    alphabet,
    digit,
    space,
    operator,
    bracket,
    other,
    string,
    split
}
```
ただの[Enum](https://qiita.com/suke_masa/items/bd242617a2b9bb773cbd)ですね。カンタン。

これは1文字ずつ解析するタイプなのでforで文字列ぶん回してください。

```java:example.java
Lexer.listRefresh(); // 最初に初期化しておくと良き
String test = "解析する文字列";
for (char c : test.toCharArray()){
    Lexer.analyze(c);
}
Lexer.endAnalyze(); // 終了したので
System.out.println(Lexer.getList()); // 処理の結果を表示する。
```

ここを参考にして作りました。ありがとうございました。

https://qiita.com/mirror11akii/items/7fe6fd3143b9a1eb9683

まぁこんなもんですかね。近いうちアドオンシリーズは更新したいです。
またJavaの方も買ったのでまたmodシリーズとかやるかもしれません。

追記(まだ増えるかも)
気づいたらまじ1年経ってる...
更新頻度がやばい