Пример #1
0
bool CompileStatement(CompileInstance &inst, const mtlChars &statement)
{
    if (IsGlobal(inst)) {
        AddError(inst, "Global statements not allowed", statement);
        return false;
    }

    Parser parser;
    parser.SetBuffer(statement);
    mtlList<mtlChars> m;
    mtlChars seq;
    bool result = false;
    switch (parser.Match("%w%w=%s%|%s=%s%|%w(%s)%|%w%w", m, &seq)) {
    case 0:
        result = DeclareVar(inst, m.GetFirst()->GetItem(), m.GetFirst()->GetNext()->GetItem(), m.GetFirst()->GetNext()->GetNext()->GetItem());
        break;
    case 1:
        result = AssignVar(inst, m.GetFirst()->GetItem(), m.GetFirst()->GetNext()->GetItem());
        break;
    case 2:
        // TODO: implement function calling
        // store result in temp
        result = false;
        AddError(inst, "Calling functions is not supported yet", seq);
        break;
    case 3:
        result = DeclareVar(inst, m.GetFirst()->GetItem(), m.GetFirst()->GetNext()->GetItem(), "");
        break;
    default:
        result = false;
        AddError(inst, "Malformed statement", statement);
        break;
    }
    return result;
}
Пример #2
0
bool DeclareVar(CompileInstance &inst, const mtlChars &type, const mtlChars &name, const mtlChars &expr)
{
    const TypeInfo *type_info = GetTypeInfo(type);
    if (type_info == NULL) {
        AddError(inst, "Unknown type", type);
        return false;
    }

    if (!IsValidName(name)) {
        AddError(inst, "Invalid name", name);
        return false;
    }

    const Definition *prev_def = GetType(inst, name);
    if (prev_def != NULL) {
        AddError(inst, "Redeclaration", name);
        return false;
    }

    const int rel_sptr = inst.scopes.GetLast()->GetItem().rel_sptr;

    Definition &def = inst.scopes.GetLast()->GetItem().defs.AddLast();
    def.name.Copy(name);
    def.mut            = Mutable;
    def.type           = *type_info;
    def.scope_level    = inst.scopes.GetSize() - 1;
    def.value.var_addr = rel_sptr;

    //def.values.Create(type_info->size);
    //for (int addr_offset = 0; addr_offset < type_info->size; ++addr_offset) {
    //	def.values[addr_offset].var_addr = rel_sptr + addr_offset;
    //}

    for (int i = 0; i < type_info->size; ++i) {
        Definition &def = inst.scopes.GetLast()->GetItem().defs.AddLast();
        def.name.Copy(name);
        def.name.Append(Accessor);
        def.name.Append(Members[i]);
        def.mut            = Mutable;
        def.type           = gSubTypes[type_info->type];
        def.scope_level    = inst.scopes.GetSize() - 1;
        def.value.var_addr = rel_sptr + i;
    }

    PushStack(inst, type_info->size);

    return (expr.GetSize() > 0) ? AssignVar(inst, name, expr) : true;
}
Пример #3
0
void CVar::SetVar(class CVar var)
{
	 var_type = var.var_type;
	 AssignVar(var);
}