[update] Unified the exceptions thrown by sjscript.
This commit is contained in:
parent
b4690f9603
commit
109ae328b8
22
sjscript/src/sjscript/ScriptException.d
Normal file
22
sjscript/src/sjscript/ScriptException.d
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/// License: MIT
|
||||||
|
module sjscript.ScriptException;
|
||||||
|
|
||||||
|
import dast.tokenize;
|
||||||
|
|
||||||
|
///
|
||||||
|
class ScriptException : Exception {
|
||||||
|
public:
|
||||||
|
///
|
||||||
|
this(string msg, TokenPos pos, string file = __FILE__, size_t line = __LINE__) {
|
||||||
|
super(msg, file, line);
|
||||||
|
this.pos = pos;
|
||||||
|
}
|
||||||
|
///
|
||||||
|
this(
|
||||||
|
string msg, size_t stline, size_t stchar,
|
||||||
|
string file = __FILE__, size_t line = __LINE__) {
|
||||||
|
super(msg, file, line);
|
||||||
|
pos = TokenPos(stline, stline, stchar, stchar+1);
|
||||||
|
}
|
||||||
|
const TokenPos pos;
|
||||||
|
}
|
@ -1,27 +0,0 @@
|
|||||||
/// License: MIT
|
|
||||||
module sjscript.exception;
|
|
||||||
|
|
||||||
import sjscript.Token;
|
|
||||||
|
|
||||||
///
|
|
||||||
class ScriptException : Exception {
|
|
||||||
public:
|
|
||||||
///
|
|
||||||
this(string msg, Token token, string file = __FILE__, size_t line = __LINE__) {
|
|
||||||
super(msg, file, line);
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
const Token token;
|
|
||||||
}
|
|
||||||
///
|
|
||||||
class PreprocessException : ScriptException {
|
|
||||||
public:
|
|
||||||
mixin ExceptionConstructor;
|
|
||||||
}
|
|
||||||
|
|
||||||
private mixin template ExceptionConstructor() {
|
|
||||||
public:
|
|
||||||
this(string msg, Token token, string file = __FILE__, size_t line = __LINE__) {
|
|
||||||
super(msg, token, file, line);
|
|
||||||
}
|
|
||||||
}
|
|
@ -38,6 +38,6 @@ float CallFunction(string name, float[] args) {
|
|||||||
case "step": EnforceArgs!2; return args[1] > args[0]? 1: 0;
|
case "step": EnforceArgs!2; return args[1] > args[0]? 1: 0;
|
||||||
case "clamp": EnforceArgs!3; return clamp(args[0], args[1], args[2]);
|
case "clamp": EnforceArgs!3; return clamp(args[0], args[1], args[2]);
|
||||||
|
|
||||||
default: throw new Exception("unknown exception");
|
default: throw new Exception("unknown function");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,10 +11,9 @@ import sjscript.Token,
|
|||||||
sjscript.preprocess;
|
sjscript.preprocess;
|
||||||
|
|
||||||
public {
|
public {
|
||||||
import sjscript.Expression,
|
import sjscript.ParametersBlock,
|
||||||
sjscript.ParametersBlock,
|
sjscript.ScriptException,
|
||||||
sjscript.calculate,
|
sjscript.calculate;
|
||||||
sjscript.exception;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
|
@ -8,6 +8,7 @@ import dast.parse;
|
|||||||
|
|
||||||
import sjscript.Expression,
|
import sjscript.Expression,
|
||||||
sjscript.ParametersBlock,
|
sjscript.ParametersBlock,
|
||||||
|
sjscript.ScriptException,
|
||||||
sjscript.Token,
|
sjscript.Token,
|
||||||
sjscript.calculate;
|
sjscript.calculate;
|
||||||
|
|
||||||
@ -33,7 +34,18 @@ EOS";
|
|||||||
///
|
///
|
||||||
ParametersBlock[] Parse(R)(R tokens)
|
ParametersBlock[] Parse(R)(R tokens)
|
||||||
if (isInputRange!R && is(ElementType!R == Token)) {
|
if (isInputRange!R && is(ElementType!R == Token)) {
|
||||||
|
import dast.tokenize : TokenizeException;
|
||||||
|
|
||||||
|
alias Token = ElementType!R;
|
||||||
|
try {
|
||||||
return dast.parse.Parse!Whole(tokens, cast(RuleSet) null).blocks;
|
return dast.parse.Parse!Whole(tokens, cast(RuleSet) null).blocks;
|
||||||
|
|
||||||
|
} catch (TokenizeException e) {
|
||||||
|
throw new ScriptException(e.msg, e.srcline, e.srcchar);
|
||||||
|
|
||||||
|
} catch (ParseException!Token e) {
|
||||||
|
throw new ScriptException(e.msg, e.token.pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class RuleSet {
|
private class RuleSet {
|
||||||
|
@ -9,8 +9,8 @@ import std.algorithm,
|
|||||||
std.range.primitives,
|
std.range.primitives,
|
||||||
std.typecons;
|
std.typecons;
|
||||||
|
|
||||||
import sjscript.Token,
|
import sjscript.ScriptException,
|
||||||
sjscript.exception;
|
sjscript.Token;
|
||||||
|
|
||||||
///
|
///
|
||||||
unittest {
|
unittest {
|
||||||
@ -46,7 +46,7 @@ EOS";
|
|||||||
enum src = q"EOS
|
enum src = q"EOS
|
||||||
$unknown_template
|
$unknown_template
|
||||||
EOS";
|
EOS";
|
||||||
assertThrown!PreprocessException(Tokenize(src).array);
|
assertThrown!ScriptException(Tokenize(src).array);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,5 +243,5 @@ private struct Preprocessor(R)
|
|||||||
|
|
||||||
private void enforce(T)(T val, string msg, lazy Token token,
|
private void enforce(T)(T val, string msg, lazy Token token,
|
||||||
string file = __FILE__, size_t line = __LINE__) {
|
string file = __FILE__, size_t line = __LINE__) {
|
||||||
if (!val) throw new PreprocessException(msg, token, file, line);
|
if (!val) throw new ScriptException(msg, token.pos, file, line);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user