mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34: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.json:json:20160212'
|
||||||
compile 'org.yaml:snakeyaml:1.17'
|
compile 'org.yaml:snakeyaml:1.17'
|
||||||
|
compile 'jline:jline:2.14.5'
|
||||||
|
|
||||||
testCompile 'junit:junit:4.12'
|
testCompile 'junit:junit:4.12'
|
||||||
testCompile 'org.openjdk.jmh:jmh-core:1.13'
|
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.BlockStatement;
|
||||||
import com.annimon.ownlang.parser.ast.Statement;
|
import com.annimon.ownlang.parser.ast.Statement;
|
||||||
import com.annimon.ownlang.parser.visitors.PrintVisitor;
|
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.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Scanner;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
public final class Repl {
|
public final class Repl {
|
||||||
@ -36,14 +39,13 @@ public final class Repl {
|
|||||||
|
|
||||||
final BlockStatement history = new BlockStatement();
|
final BlockStatement history = new BlockStatement();
|
||||||
final StringBuilder buffer = new StringBuilder();
|
final StringBuilder buffer = new StringBuilder();
|
||||||
final Scanner scanner = new Scanner(System.in);
|
final ReplConsole console = initReplConsole();
|
||||||
while (true) {
|
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)) {
|
switch (line.toLowerCase(Locale.ENGLISH)) {
|
||||||
case RESET:
|
case RESET:
|
||||||
buffer.setLength(0);
|
buffer.setLength(0);
|
||||||
@ -84,7 +86,15 @@ public final class Repl {
|
|||||||
}
|
}
|
||||||
buffer.setLength(0);
|
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) {
|
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