[JAVA] Lassen Sie uns Lexer (2) implementieren

Vorwort

Ausführung Umgebung
jdk-10 IntelliJ IDEA

Vielleicht funktioniert es in der oben genannten Umgebung.

Vorheriger Artikel [Lassen Sie uns Lexer (1) implementieren] (https://qiita.com/mirror11akii/items/7fe6fd3143b9a1eb9683)

Ergänzung

Diese Serie wurde mit dem Wunsch geschrieben, mit Menschen in Kontakt zu treten, die mit mir sympathisieren, mit Menschen, die sich für neue Sprachen interessieren, und mit Java-Programmierern, die Teams entwickeln wollen. Natürlich ist es in Ordnung, andere Zwecke zu verwenden und zu durchsuchen. Ich würde mich jedoch sehr freuen, wenn Sie daran interessiert wären, und es wäre sehr hilfreich, wenn Sie mir in den Kommentaren etwas mitteilen könnten.


Ich beabsichtige, Lexer ein wenig funktionsfähig zu machen. Wie Lexer hatte ich das Gefühl, dass es schwierig ist, damit umzugehen, wenn die Anzahl der Ein- und Ausgänge unterschiedlich ist und die Anzahl der Ausgänge nicht bekannt ist.

Implementierung

FLexer.java


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

public class FLexer {

    static Stack<String> stack = new Stack();

    //private static List<Character> brackets = Arrays.asList('(',')','{','}','[',']');
    private static List<Character> operators = Arrays.asList('=','+','-','*','/');

    public static FType getType(final Character c){
        if(Character.isLetter(c)) return FType.alphabet;
        else if(Character.isDigit(c)) return FType.digit;
        else if(Character.isWhitespace(c)) return FType.space;
        else if(operators.contains(c)) return FType.operator;
        //else if(brackets.contains(c)) return FType.brackets;
        return FType.other;
    }
    public static List<Character> toList(final char[] chars){
        List<Character> list = new ArrayList<>();
        for(Character aChar : chars){
            list.add(aChar);
        }
        return list;
    }
    public static void analyze(final Character aChar){
        if(stack.empty()){
            stack.push(Character.toString(aChar));
        }else{
            final String previous = stack.pop();
            if(getType(aChar) == getType(previous.charAt(0))){
                stack.push(previous + aChar);
            }else{
                stack.push(previous);
                stack.push(Character.toString(aChar));
            }
        }
    }
    public static void disp(){
        System.out.println(stack);
    }
}

FType.java


public enum FType{
    alphabet,
    digit,
    space,
    operator,
    //bracket,
    other
}

Implementierungsbeschreibung

Ich habe keine "Klammern" implementiert, da dies problematisch ist, aber ich denke, dass dies durch Erhöhen des if-Zweigs von analyse () behoben werden kann.

public static List<Character> toList(...) Ich wollte einen Lambda-Ausdruck verwenden, also habe ich eine Funktion vorbereitet, um ihn in eine Liste umzuwandeln. public static void analyze(...) Ich dachte, wenn ich das vorherige Element lese, könnte ich es als Stapel verwenden, also habe ich es zu einem Stapel gemacht.

Lauf

Main.java


import java.io.IOException;

public class Main{
    public static void main(String[] args) throws IOException{
        System.out.println("\n--EAM");
        char[] chars = EAM.use("lib\\test.txt", eam -> eam.read());
        for (char aChar : chars) {
            System.out.print(aChar);
        }
        System.out.println( "\n--FLexer");
        FLexer.toList(chars).stream()
                            .forEach(FLexer::analyze);
        FLexer.disp();
    }
}
--EAM
close()
a = 2 + 7 * 3
log a
--FLexer
[a,  , =,  , 2,  , +,  , 7,  , *,  , 3, 
, log,  , a]

Wenn es so aussieht, ist es ein Erfolg. Wenn Sie Fragen haben, wenden Sie sich bitte.

Recommended Posts

Lassen Sie uns Lexer (1) implementieren
Lassen Sie uns Lexer (2) implementieren
Lassen Sie uns EAM implementieren
Schwanz implementieren