Move structure to being inheritance-based in preparation for reflection infrastructure. This technique relies on the vtable's dynamic dispatch for correct evaluation, and removes the giant switch eval style of previous revisions.
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
#ifndef _CHAISCRIPT_COMMON_HPP
|
||||
#define _CHAISCRIPT_COMMON_HPP
|
||||
|
||||
#include <chaiscript/dispatchkit/dispatchkit.hpp>
|
||||
|
||||
namespace chaiscript
|
||||
{
|
||||
typedef ModulePtr (*Create_Module_Func)();
|
||||
@@ -65,9 +67,6 @@ namespace chaiscript
|
||||
std::vector<TokenPtr> children;
|
||||
TokenPtr annotation;
|
||||
|
||||
Token(const std::string &token_text, int id, const char *fname) :
|
||||
text(token_text), identifier(id), filename(fname), is_cached(false) { }
|
||||
|
||||
Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
text(token_text), identifier(id), filename(fname), is_cached(false) {
|
||||
|
||||
@@ -76,6 +75,298 @@ namespace chaiscript
|
||||
end.line = end_line;
|
||||
end.column = end_col;
|
||||
}
|
||||
Token(const std::string &token_text, int id, const char *fname) :
|
||||
text(token_text), identifier(id), filename(fname), is_cached(false) { }
|
||||
|
||||
|
||||
void cache_const(const Boxed_Value &value) {
|
||||
this->cached_value = value;
|
||||
this->is_cached = true;
|
||||
}
|
||||
|
||||
virtual Boxed_Value eval(Dispatch_Engine &) {
|
||||
Boxed_Value bv;
|
||||
throw std::runtime_error("Undispatched token (internal error)");
|
||||
return bv;
|
||||
}
|
||||
};
|
||||
|
||||
struct Error_Token : public Token {
|
||||
public:
|
||||
Error_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Int_Token : public Token {
|
||||
public:
|
||||
Int_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Float_Token : public Token {
|
||||
public:
|
||||
Float_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Id_Token : public Token {
|
||||
public:
|
||||
Id_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Char_Token : public Token {
|
||||
public:
|
||||
Char_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Str_Token : public Token {
|
||||
public:
|
||||
Str_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Eol_Token : public Token {
|
||||
public:
|
||||
Eol_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Fun_Call_Token : public Token {
|
||||
public:
|
||||
Fun_Call_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Inplace_Fun_Call_Token : public Token {
|
||||
public:
|
||||
Inplace_Fun_Call_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Arg_List_Token : public Token {
|
||||
public:
|
||||
Arg_List_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Variable_Token : public Token {
|
||||
public:
|
||||
Variable_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Equation_Token : public Token {
|
||||
public:
|
||||
Equation_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Var_Decl_Token : public Token {
|
||||
public:
|
||||
Var_Decl_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Comparison_Token : public Token {
|
||||
public:
|
||||
Comparison_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Additive_Token : public Token {
|
||||
public:
|
||||
Additive_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Multiplicative_Token : public Token {
|
||||
public:
|
||||
Multiplicative_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Array_Call_Token : public Token {
|
||||
public:
|
||||
Array_Call_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Dot_Access_Token : public Token {
|
||||
public:
|
||||
Dot_Access_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Quoted_String_Token : public Token {
|
||||
public:
|
||||
Quoted_String_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Single_Quoted_String_Token : public Token {
|
||||
public:
|
||||
Single_Quoted_String_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Lambda_Token : public Token {
|
||||
public:
|
||||
Lambda_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Block_Token : public Token {
|
||||
public:
|
||||
Block_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Def_Token : public Token {
|
||||
public:
|
||||
Def_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct While_Token : public Token {
|
||||
public:
|
||||
While_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct If_Token : public Token {
|
||||
public:
|
||||
If_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct For_Token : public Token {
|
||||
public:
|
||||
For_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Inline_Array_Token : public Token {
|
||||
public:
|
||||
Inline_Array_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Inline_Map_Token : public Token {
|
||||
public:
|
||||
Inline_Map_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Return_Token : public Token {
|
||||
public:
|
||||
Return_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct File_Token : public Token {
|
||||
public:
|
||||
File_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Prefix_Token : public Token {
|
||||
public:
|
||||
Prefix_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Break_Token : public Token {
|
||||
public:
|
||||
Break_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Map_Pair_Token : public Token {
|
||||
public:
|
||||
Map_Pair_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Value_Range_Token : public Token {
|
||||
public:
|
||||
Value_Range_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Inline_Range_Token : public Token {
|
||||
public:
|
||||
Inline_Range_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Annotation_Token : public Token {
|
||||
public:
|
||||
Annotation_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Try_Token : public Token {
|
||||
public:
|
||||
Try_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Catch_Token : public Token {
|
||||
public:
|
||||
Catch_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Finally_Token : public Token {
|
||||
public:
|
||||
Finally_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
};
|
||||
struct Method_Token : public Token {
|
||||
public:
|
||||
Method_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Attr_Decl_Token : public Token {
|
||||
public:
|
||||
Attr_Decl_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Shift_Token : public Token {
|
||||
public:
|
||||
Shift_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Equality_Token : public Token {
|
||||
public:
|
||||
Equality_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Bitwise_And_Token : public Token {
|
||||
public:
|
||||
Bitwise_And_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Bitwise_Xor_Token : public Token {
|
||||
public:
|
||||
Bitwise_Xor_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Bitwise_Or_Token : public Token {
|
||||
public:
|
||||
Bitwise_Or_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Logical_And_Token : public Token {
|
||||
public:
|
||||
Logical_And_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
struct Logical_Or_Token : public Token {
|
||||
public:
|
||||
Logical_Or_Token(const std::string &token_text, int id, const char *fname, int start_line, int start_col, int end_line, int end_col) :
|
||||
Token(token_text, id, fname, start_line, start_col, end_line, end_col) { }
|
||||
Boxed_Value eval(Dispatch_Engine &ss);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -86,6 +377,7 @@ namespace chaiscript
|
||||
File_Position start_position;
|
||||
File_Position end_position;
|
||||
const char *filename;
|
||||
std::vector<TokenPtr> call_stack;
|
||||
|
||||
Eval_Error(const std::string &why, const File_Position &where, const char *fname) :
|
||||
std::runtime_error("Error: \"" + why + "\" " +
|
||||
@@ -95,13 +387,9 @@ namespace chaiscript
|
||||
reason(why), start_position(where), end_position(where), filename(fname)
|
||||
{ }
|
||||
|
||||
Eval_Error(const std::string &why, const TokenPtr &where)
|
||||
: std::runtime_error("Error: \"" + why + "\" " +
|
||||
(std::string(where->filename) != "__EVAL__" ? ("in '" + std::string(where->filename) + "' ") : "during evaluation ") +
|
||||
"at (" + boost::lexical_cast<std::string>(where->start.line) + ", " +
|
||||
boost::lexical_cast<std::string>(where->start.column) + ")"),
|
||||
reason(why), start_position(where->start), end_position(where->end), filename(where->filename) {
|
||||
}
|
||||
Eval_Error(const std::string &why)
|
||||
: std::runtime_error("Error: \"" + why + "\" "),
|
||||
reason(why) {}
|
||||
|
||||
virtual ~Eval_Error() throw() {}
|
||||
};
|
||||
@@ -123,18 +411,15 @@ namespace chaiscript
|
||||
*/
|
||||
struct Return_Value {
|
||||
Boxed_Value retval;
|
||||
TokenPtr location;
|
||||
|
||||
Return_Value(const Boxed_Value &return_value, const TokenPtr where) : retval(return_value), location(where) { }
|
||||
Return_Value(const Boxed_Value &return_value) : retval(return_value) { }
|
||||
};
|
||||
|
||||
/**
|
||||
* Special type indicating a call to 'break'
|
||||
*/
|
||||
struct Break_Loop {
|
||||
TokenPtr location;
|
||||
|
||||
Break_Loop(const TokenPtr where) : location(where) { }
|
||||
Break_Loop() { }
|
||||
};
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user