#include <msp/strings/format.h>
#include "statement.h"
+#include "token.h"
#include "type.h"
using namespace std;
string Statement::get_signature() const
{
string result;
- for(Arguments::const_iterator i = args.begin(); i!=args.end(); ++i)
- result += i->get_signature();
+ for(const Value &a: args)
+ result += a.get_signature();
return result;
}
+Statement &Statement::append_from_token(const Token &token)
+{
+ if(token.type==Token::INTEGER)
+ return append(lexical_cast<IntType::Store>(token.str, Fmt().autobase()));
+ else if(token.type==Token::FLOAT)
+ return append(lexical_cast<FloatType::Store>(token.str));
+ else if(token.type==Token::STRING)
+ return append(token.str);
+ else if(token.type==Token::IDENTIFIER)
+ {
+ if(token.str=="true")
+ return append(true);
+ else if(token.str=="false")
+ return append(false);
+ else
+ return append(Value(Symbol(token.str)));
+ }
+ else
+ throw invalid_argument("Statement::append_from_token");
+}
+
StatementInfo::StatementInfo():
args_size(0)
key(k, s),
args_size(0)
{
- for(string::const_iterator i=key.signature.begin(); i!=key.signature.end(); ++i)
+ for(char c: key.signature)
{
arg_offsets.push_back(args_size);
- switch(*i)
+ switch(c)
{
case IntType::signature:
args_size += sizeof(IntType::Store);