Абстракция для совместимости с 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; package com.annimon.ownlang;
import com.annimon.ownlang.lib.CallStack;
import com.annimon.ownlang.parser.Lexer; import com.annimon.ownlang.parser.Lexer;
import com.annimon.ownlang.parser.Parser; import com.annimon.ownlang.parser.Parser;
import com.annimon.ownlang.parser.SourceLoader; import com.annimon.ownlang.parser.SourceLoader;
@ -90,7 +89,7 @@ public final class Main {
measurement.start("Execution time"); measurement.start("Execution time");
program.execute(); program.execute();
} catch (Exception ex) { } catch (Exception ex) {
handleException(Thread.currentThread(), ex); Console.handleException(Thread.currentThread(), ex);
} finally { } finally {
if (showMeasurements) { if (showMeasurements) {
measurement.stop("Execution time"); 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>();; 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) { public static synchronized void enter(String name, Function function) {
calls.push(new CallInfo(name, function)); calls.push(new CallInfo(name, function));
} }

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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