code: func (c *Compiler) Compile() (string, []error) {
  	var errors []error
  	// continue looping over the tokens until
  	// the stack has been exhausted.
  	for c.pos < len(c.tokens) {
  		if err := c.compileLine(); err != nil {
  			errors = append(errors, err)
  		}
  	}
  
  	// turn the binary to hex
  	var bin string
  	for _, v := range c.binary {
  		switch v := v.(type) {
  		case vm.OpCode:
  			bin += fmt.Sprintf("%x", []byte{byte(v)})
  		case []byte:
  			bin += fmt.Sprintf("%x", v)
  		}
  	}
  	return bin, errors
  }
docs: // Compile compiles the current tokens and returns a
  // binary string that can be interpreted by the EVM
  // and an error if it failed.
  //
  // compile is the second stage in the compile phase
  // which compiles the tokens to EVM instructions.