mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Добавлен обработчик консольного ввода JLine
This commit is contained in:
parent
cc4bd1f6af
commit
9353bf9d20
@ -93,6 +93,7 @@ dependencies {
|
||||
}
|
||||
compile 'org.json:json:20160212'
|
||||
compile 'org.yaml:snakeyaml:1.17'
|
||||
compile 'jline:jline:2.14.5'
|
||||
|
||||
testCompile 'junit:junit:4.12'
|
||||
testCompile 'org.openjdk.jmh:jmh-core:1.13'
|
||||
|
@ -13,11 +13,14 @@ import com.annimon.ownlang.parser.Token;
|
||||
import com.annimon.ownlang.parser.ast.BlockStatement;
|
||||
import com.annimon.ownlang.parser.ast.Statement;
|
||||
import com.annimon.ownlang.parser.visitors.PrintVisitor;
|
||||
import com.annimon.ownlang.utils.repl.JLineConsole;
|
||||
import com.annimon.ownlang.utils.repl.ReplConsole;
|
||||
import com.annimon.ownlang.utils.repl.SystemConsole;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Scanner;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public final class Repl {
|
||||
@ -36,14 +39,13 @@ public final class Repl {
|
||||
|
||||
final BlockStatement history = new BlockStatement();
|
||||
final StringBuilder buffer = new StringBuilder();
|
||||
final Scanner scanner = new Scanner(System.in);
|
||||
final ReplConsole console = initReplConsole();
|
||||
while (true) {
|
||||
System.out.print((buffer.length() == 0) ? "\n> " : " ");
|
||||
console.setPrompt((buffer.length() == 0) ? "\n> " : " ");
|
||||
|
||||
if (!scanner.hasNextLine()) break;
|
||||
final String line = console.readLine();
|
||||
if (line == null || EXIT.equalsIgnoreCase(line)) break;
|
||||
|
||||
final String line = scanner.nextLine();
|
||||
if (EXIT.equalsIgnoreCase(line)) break;
|
||||
switch (line.toLowerCase(Locale.ENGLISH)) {
|
||||
case RESET:
|
||||
buffer.setLength(0);
|
||||
@ -84,7 +86,15 @@ public final class Repl {
|
||||
}
|
||||
buffer.setLength(0);
|
||||
}
|
||||
scanner.close();
|
||||
console.close();
|
||||
}
|
||||
|
||||
private static ReplConsole initReplConsole() {
|
||||
try {
|
||||
return new JLineConsole();
|
||||
} catch (IOException ioe) {
|
||||
return new SystemConsole();
|
||||
}
|
||||
}
|
||||
|
||||
private static void printHelp(boolean full) {
|
||||
|
@ -0,0 +1,41 @@
|
||||
package com.annimon.ownlang.utils.repl;
|
||||
|
||||
import java.io.IOException;
|
||||
import jline.TerminalFactory;
|
||||
import jline.console.ConsoleReader;
|
||||
|
||||
public class JLineConsole implements ReplConsole {
|
||||
|
||||
private final ConsoleReader console;
|
||||
|
||||
public JLineConsole() throws IOException {
|
||||
console = new ConsoleReader();
|
||||
}
|
||||
|
||||
public ConsoleReader getConsole() {
|
||||
return console;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrompt(String prompt) {
|
||||
console.setPrompt(prompt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readLine() {
|
||||
try {
|
||||
return console.readLine();
|
||||
} catch (IOException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
try {
|
||||
TerminalFactory.get().restore();
|
||||
} catch (Exception ignored) {
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,10 @@
|
||||
package com.annimon.ownlang.utils.repl;
|
||||
|
||||
public interface ReplConsole {
|
||||
|
||||
void setPrompt(String prompt);
|
||||
|
||||
String readLine();
|
||||
|
||||
void close();
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
package com.annimon.ownlang.utils.repl;
|
||||
|
||||
import java.util.Scanner;
|
||||
|
||||
public class SystemConsole implements ReplConsole {
|
||||
|
||||
private final Scanner scanner;
|
||||
|
||||
public SystemConsole() {
|
||||
scanner = new Scanner(System.in);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPrompt(String prompt) {
|
||||
System.out.print(prompt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readLine() {
|
||||
if (!scanner.hasNextLine()) {
|
||||
return null;
|
||||
}
|
||||
return scanner.nextLine();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
scanner.close();
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user