리플 만들기.

12217 단어 JavaREPL
리플 만들기.
Kottlin 원본의Codriding을 통해 JLine이라는 조종사 입력 출력 처리 프로그램 라이브러리를 알 수 있습니다.
JLine: http://jline.sourceforge.net/
Kotlin GitHub: https://github.com/JetBrains/kotlin
Kotlin용 REPL
J라인에서 한 일을 인코딩한 기억이 나서 좀 놀랐어요.
역시 나쁜 일인 줄 몰랐어요.
이번에는 Kotlin을 사용하지 않았습니다.자바로 만들었어.
그럼에도 불구하고 리플의 문법 해석/문법 집행 등은 아직 제작되지 않았다.언어 방법도 결정되지 않았기 때문이다.
구문 입력이 적용될 때까지 시작, 명령(Kotlin REPL의:)
코틀린의 리플을 따라 해봤어요.
Kotlin REPL 시작

Kotlin REPL 명령 실행
package replbase;

import java.io.IOException;
import java.io.PrintWriter;
import jline.ConsoleReader;

public class REPLBase {

    private final String COMMAND = ":";
    private final String PROMPT_READLINE = ">>> ";
    private final String PROMPT_INCOMPLETE = "... ";
    private ConsoleReader consoleReader;

    enum STATUS {
        READLINE,
        INCOMPLETE,
        QUIT
    }
    private STATUS status = STATUS.READLINE;

    public static void main(String[] args) {
        REPLBase replBase = new REPLBase();
        replBase.start();
    }

    private void start() {
        try(PrintWriter printwriter = new PrintWriter(System.out);) {
            consoleReader = new ConsoleReader(System.in, printwriter);
            consoleReader.printString("Welcome to REPLBase.(JRE " + System.getProperty("java.runtime.version") + ")\n");
            consoleReader.printString("Type :help for help, :quit for quit\n");
            while(status != STATUS.QUIT) {
                String input = readLine();
                analyze(input);
            }
        }
        catch(IOException exception) {
            System.err.printf(exception.toString());
        }
    }

    private String readLine() throws IOException{
        String prompt = status == STATUS.READLINE ? PROMPT_READLINE : PROMPT_INCOMPLETE;
        String input = consoleReader.readLine(prompt);
        return input;
    }

    private void analyze(String input) throws IOException {
        if((status != STATUS.INCOMPLETE) &&
           (input.startsWith(COMMAND) == true)) {
            command(input);
        }
        else {
            compile(input);
        }
    }

    private void compile(String input) {
        if(input.endsWith("}") != true) {
            status = STATUS.INCOMPLETE;
        }
        else {
            status = STATUS.READLINE;
        }
    }

    private void command(String input) throws IOException {
        String command = input.replaceFirst(COMMAND, "");
        switch(command) {
            case "help":
                consoleReader.printString("Available commands:\n" +
                                             ":help    show this help\n" +
                                             ":quit    exit the interpreter\n");
                break;
            case "quit":
                status = STATUS.QUIT;
                break;
            default:
                consoleReader.printString("Unknown command\n" +
                                              "Type :help for help\n");
                break;
        }
    }

}
이것을 기초 위로 확장할 수 있다.
REPLBase를 기본 클래스로 한다면 다양한 방법을 사용할 수 있습니다.
start() 메서드의 ConstoreReader는 JLine입니다.
readline () 방법은 표시/입력 대기/입력선이 받아들일 수 있음을 알립니다.
받은 결과를 analyze () 내에서 명령 처리 (command () 와 문법 해석 후 처리 (commpile () 로 나눈다.
command () 방법을 확장하면 명령을 추가하거나 변경할 수 있습니다.
comple () 방법을 확장하면 REPL 호스트를 설치할 수 있습니다.
analyze ()/commond ()/commpile () 는 파생 측면에서 실현할 수 있고 확장할 수 있습니다.

좋은 웹페이지 즐겨찾기