mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 00:34:20 +03:00
Возможность изменить вывод в консоли или перенаправить вывод в строку
This commit is contained in:
parent
eb7430f507
commit
52d7121751
@ -1,6 +1,8 @@
|
||||
package com.annimon.ownlang;
|
||||
|
||||
import com.annimon.ownlang.lib.CallStack;
|
||||
import com.annimon.ownlang.outputsettings.ConsoleOutputSettings;
|
||||
import com.annimon.ownlang.outputsettings.OutputSettings;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.PrintStream;
|
||||
@ -9,44 +11,51 @@ import java.io.UnsupportedEncodingException;
|
||||
public class Console {
|
||||
|
||||
private Console() { }
|
||||
|
||||
private static OutputSettings outputSettings = new ConsoleOutputSettings();
|
||||
|
||||
private static final String FILE_PREFIX = "tmp/";
|
||||
private static boolean filePrefixEnabled;
|
||||
public static void useSettings(OutputSettings outputSettings) {
|
||||
Console.outputSettings = outputSettings;
|
||||
}
|
||||
|
||||
public static void enableFilePrefix() {
|
||||
Console.filePrefixEnabled = true;
|
||||
public static OutputSettings getSettings() {
|
||||
return outputSettings;
|
||||
}
|
||||
|
||||
public static String newline() {
|
||||
return System.lineSeparator();
|
||||
return outputSettings.newline();
|
||||
}
|
||||
|
||||
public static void print(String value) {
|
||||
System.out.print(value);
|
||||
outputSettings.print(value);
|
||||
}
|
||||
|
||||
public static void print(Object value) {
|
||||
print(value.toString());
|
||||
outputSettings.print(value);
|
||||
}
|
||||
|
||||
public static void println() {
|
||||
System.out.println();
|
||||
outputSettings.println();
|
||||
}
|
||||
|
||||
public static void println(String value) {
|
||||
System.out.println(value);
|
||||
outputSettings.println(value);
|
||||
}
|
||||
|
||||
public static void println(Object value) {
|
||||
println(value.toString());
|
||||
outputSettings.println(value);
|
||||
}
|
||||
|
||||
public static String text() {
|
||||
return outputSettings.getText();
|
||||
}
|
||||
|
||||
public static void error(Throwable throwable) {
|
||||
error(throwable.toString());
|
||||
outputSettings.error(throwable);
|
||||
}
|
||||
|
||||
public static void error(CharSequence value) {
|
||||
System.err.println(value);
|
||||
outputSettings.error(value);
|
||||
}
|
||||
|
||||
public static void handleException(Thread thread, Throwable throwable) {
|
||||
@ -68,14 +77,6 @@ public class Console {
|
||||
}
|
||||
|
||||
public static File fileInstance(String path) {
|
||||
final String filepath;
|
||||
if (filePrefixEnabled) {
|
||||
filepath = FILE_PREFIX.concat(path);
|
||||
} else {
|
||||
filepath = path;
|
||||
}
|
||||
return new File(filepath);
|
||||
return outputSettings.fileInstance(path);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,56 @@
|
||||
package com.annimon.ownlang.outputsettings;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class ConsoleOutputSettings implements OutputSettings {
|
||||
|
||||
@Override
|
||||
public String newline() {
|
||||
return System.lineSeparator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void print(String value) {
|
||||
System.out.print(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void print(Object value) {
|
||||
print(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println() {
|
||||
System.out.println();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(String value) {
|
||||
System.out.println(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(Object value) {
|
||||
println(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText() {
|
||||
return "";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable throwable) {
|
||||
error(throwable.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(CharSequence value) {
|
||||
System.err.println(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public File fileInstance(String path) {
|
||||
return new File(path);
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package com.annimon.ownlang.outputsettings;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public interface OutputSettings {
|
||||
|
||||
String newline();
|
||||
|
||||
void print(String value);
|
||||
|
||||
void print(Object value);
|
||||
|
||||
void println();
|
||||
|
||||
void println(String value);
|
||||
|
||||
void println(Object value);
|
||||
|
||||
String getText();
|
||||
|
||||
void error(Throwable throwable);
|
||||
|
||||
void error(CharSequence value);
|
||||
|
||||
File fileInstance(String path);
|
||||
|
||||
}
|
@ -0,0 +1,71 @@
|
||||
package com.annimon.ownlang.outputsettings;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
public class StringOutputSettings implements OutputSettings {
|
||||
|
||||
private final StringBuffer out, err;
|
||||
|
||||
public StringOutputSettings() {
|
||||
this(new StringBuffer());
|
||||
}
|
||||
|
||||
public StringOutputSettings(StringBuffer out) {
|
||||
this(out, out);
|
||||
}
|
||||
|
||||
public StringOutputSettings(StringBuffer out, StringBuffer err) {
|
||||
this.out = out;
|
||||
this.err = err;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String newline() {
|
||||
return System.lineSeparator();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void print(String value) {
|
||||
out.append(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void print(Object value) {
|
||||
out.append(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println() {
|
||||
out.append(newline());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(String value) {
|
||||
out.append(value).append(newline());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void println(Object value) {
|
||||
println(value.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getText() {
|
||||
return out.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(Throwable throwable) {
|
||||
error(throwable.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void error(CharSequence value) {
|
||||
err.append(value).append(newline());
|
||||
}
|
||||
|
||||
@Override
|
||||
public File fileInstance(String path) {
|
||||
return new File(path);
|
||||
}
|
||||
}
|
@ -3,12 +3,14 @@ package com.annimon.ownlang.utils;
|
||||
import com.annimon.ownlang.Console;
|
||||
import com.annimon.ownlang.exceptions.StoppedException;
|
||||
import com.annimon.ownlang.lib.CallStack;
|
||||
import com.annimon.ownlang.outputsettings.ConsoleOutputSettings;
|
||||
import com.annimon.ownlang.parser.Lexer;
|
||||
import com.annimon.ownlang.parser.Parser;
|
||||
import com.annimon.ownlang.parser.SourceLoader;
|
||||
import com.annimon.ownlang.parser.Token;
|
||||
import com.annimon.ownlang.parser.ast.Statement;
|
||||
import com.annimon.ownlang.parser.visitors.FunctionAdder;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
@ -18,7 +20,12 @@ import java.util.List;
|
||||
public final class Sandbox {
|
||||
|
||||
public static void main(String[] args) throws IOException {
|
||||
Console.enableFilePrefix();
|
||||
Console.useSettings(new ConsoleOutputSettings() {
|
||||
@Override
|
||||
public File fileInstance(String path) {
|
||||
return new File("tmp/" + path);
|
||||
}
|
||||
});
|
||||
final String input = SourceLoader.readAndCloseStream(System.in);
|
||||
dumpInputArguments(input, args);
|
||||
|
||||
|
@ -1,8 +1,11 @@
|
||||
package com.annimon.ownlang.parser;
|
||||
|
||||
import com.annimon.ownlang.Console;
|
||||
import com.annimon.ownlang.lib.Functions;
|
||||
import com.annimon.ownlang.lib.NumberValue;
|
||||
import com.annimon.ownlang.lib.Variables;
|
||||
import com.annimon.ownlang.outputsettings.OutputSettings;
|
||||
import com.annimon.ownlang.outputsettings.StringOutputSettings;
|
||||
import com.annimon.ownlang.parser.ast.FunctionDefineStatement;
|
||||
import com.annimon.ownlang.parser.ast.Statement;
|
||||
import com.annimon.ownlang.parser.ast.Visitor;
|
||||
@ -94,6 +97,22 @@ public class ProgramsTest {
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOutput() throws IOException {
|
||||
OutputSettings oldSettings = Console.getSettings();
|
||||
Console.useSettings(new StringOutputSettings());
|
||||
String source = "for i = 0, i <= 5, i++\n print i";
|
||||
final Statement s = Parser.parse(Lexer.tokenize(source));
|
||||
try {
|
||||
s.execute();
|
||||
assertEquals("012345", Console.text());
|
||||
} catch (Exception oae) {
|
||||
Assert.fail(oae.toString());
|
||||
} finally {
|
||||
Console.useSettings(oldSettings);
|
||||
}
|
||||
}
|
||||
|
||||
private static Visitor testFunctionsExecutor = new AbstractVisitor() {
|
||||
@Override
|
||||
public void visit(FunctionDefineStatement s) {
|
||||
|
Loading…
Reference in New Issue
Block a user