Абстракция для совместимости с Android-проектом

This commit is contained in:
Victor 2016-02-19 17:26:35 +02:00
parent 24ae7dae1d
commit 9fb34ae09b
10 changed files with 89 additions and 20 deletions

View File

@ -0,0 +1,56 @@
package com.annimon.ownlang;
import com.annimon.ownlang.lib.CallStack;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
public class Console {
public static void print(String value) {
System.out.print(value);
}
public static void print(Object value) {
print(value.toString());
}
public static void println() {
System.out.println();
}
public static void println(String value) {
System.out.println(value);
}
public static void println(Object value) {
println(value.toString());
}
public static void error(Throwable throwable) {
error(throwable.toString());
}
public static void error(CharSequence value) {
System.err.println(value);
}
public static void handleException(Thread thread, Throwable throwable) {
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try(final PrintStream ps = new PrintStream(baos)) {
ps.printf("%s in %s\n", throwable.getMessage(), thread.getName());
for (CallStack.CallInfo call : CallStack.getCalls()) {
ps.printf("\tat %s\n", call);
}
ps.println();
throwable.printStackTrace(ps);
ps.flush();
}
try {
error(baos.toString("UTF-8"));
} catch (UnsupportedEncodingException ex) {
error(baos.toString());
}
}
}

View File

@ -1,6 +1,5 @@
package com.annimon.ownlang;
import com.annimon.ownlang.lib.CallStack;
import com.annimon.ownlang.parser.Lexer;
import com.annimon.ownlang.parser.Parser;
import com.annimon.ownlang.parser.SourceLoader;
@ -90,7 +89,7 @@ public final class Main {
measurement.start("Execution time");
program.execute();
} catch (Exception ex) {
handleException(Thread.currentThread(), ex);
Console.handleException(Thread.currentThread(), ex);
} finally {
if (showMeasurements) {
measurement.stop("Execution time");
@ -99,12 +98,4 @@ public final class Main {
}
}
}
public static void handleException(Thread thread, Throwable throwable) {
System.err.printf("%s in %s\n", throwable.getMessage(), thread.getName());
for (CallStack.CallInfo call : CallStack.getCalls()) {
System.err.printf("\tat %s\n", call);
}
throwable.printStackTrace();
}
}

View File

@ -7,6 +7,10 @@ public final class CallStack {
private static final Deque<CallInfo> calls = new ConcurrentLinkedDeque<CallInfo>();;
public static synchronized void clear() {
calls.clear();
}
public static synchronized void enter(String name, Function function) {
calls.push(new CallInfo(name, function));
}

View File

@ -16,6 +16,12 @@ public final class Variables {
static {
stack = new Stack<>();
variables = new ConcurrentHashMap<>();
Variables.clear();
}
public static void clear() {
stack.clear();
variables.clear();
variables.put("true", NumberValue.ONE);
variables.put("false", NumberValue.ZERO);
}

View File

@ -1,5 +1,6 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.Console;
import com.annimon.ownlang.lib.Function;
import com.annimon.ownlang.lib.NumberValue;
import com.annimon.ownlang.lib.Value;
@ -9,10 +10,10 @@ public final class std_echo implements Function {
@Override
public Value execute(Value... args) {
for (Value arg : args) {
System.out.print(arg.asString());
System.out.print(" ");
Console.print(arg.asString());
Console.print(" ");
}
System.out.println();
Console.println();
return NumberValue.ZERO;
}
}

View File

@ -1,6 +1,6 @@
package com.annimon.ownlang.lib.modules.functions;
import com.annimon.ownlang.Main;
import com.annimon.ownlang.Console;
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
import com.annimon.ownlang.lib.*;
@ -26,7 +26,7 @@ public final class std_thread implements Function {
}
final Thread thread = new Thread(() -> body.execute(params));
thread.setUncaughtExceptionHandler(Main::handleException);
thread.setUncaughtExceptionHandler(Console::handleException);
thread.start();
return NumberValue.ZERO;
}

View File

@ -48,6 +48,7 @@ public final class Parser {
private final List<Token> tokens;
private final int size;
private final ParseErrors parseErrors;
private Statement parsedStatement;
private int pos;
@ -57,6 +58,10 @@ public final class Parser {
parseErrors = new ParseErrors();
}
public Statement getParsedStatement() {
return parsedStatement;
}
public ParseErrors getParseErrors() {
return parseErrors;
}
@ -72,6 +77,7 @@ public final class Parser {
recover();
}
}
parsedStatement = result;
return result;
}

View File

@ -1,5 +1,7 @@
package com.annimon.ownlang.parser.ast;
import com.annimon.ownlang.Console;
/**
*
* @author aNNiMON
@ -14,7 +16,7 @@ public final class PrintStatement implements Statement {
@Override
public void execute() {
System.out.print(expression.eval());
Console.print(expression.eval());
}
@Override

View File

@ -1,5 +1,7 @@
package com.annimon.ownlang.parser.ast;
import com.annimon.ownlang.Console;
/**
*
* @author aNNiMON
@ -14,7 +16,7 @@ public final class PrintlnStatement implements Statement {
@Override
public void execute() {
System.out.println(expression.eval());
Console.println(expression.eval());
}
@Override

View File

@ -1,5 +1,6 @@
package com.annimon.ownlang.parser.visitors;
import com.annimon.ownlang.Console;
import com.annimon.ownlang.parser.ast.*;
/**
@ -11,18 +12,18 @@ public final class VariablePrinter extends AbstractVisitor {
@Override
public void visit(AssignmentExpression s) {
super.visit(s);
System.out.println(s.target);
Console.println(s.target);
}
@Override
public void visit(ContainerAccessExpression s) {
super.visit(s);
System.out.println(s.variable);
Console.println(s.variable);
}
@Override
public void visit(VariableExpression s) {
super.visit(s);
System.out.println(s.name);
Console.println(s.name);
}
}