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; }
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; }
void CVar::SetVar(class CVar var) { var_type = var.var_type; AssignVar(var); }