리플 만들기.
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 () 는 파생 측면에서 실현할 수 있고 확장할 수 있습니다.
Reference
이 문제에 관하여(리플 만들기.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/cloudsnow/items/f377edfda5d5ff1c9906텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)