code: func (p *Parser) Parse(code string, c *CompileContext) ([]*ParserMessage, error) {
  	// We set p.code so that the string doesn't get garbage collected
  	var s *C.char = C.CString(code)
  	p.code = code
  	p.parser.s = s
  	p.parser.send = C._go_mrb_calc_send(s)
  
  	var ctx *C.mrbc_context
  	if c != nil {
  		ctx = c.ctx
  	}
  	C.mrb_parser_parse(p.parser, ctx)
  
  	var warnings []*ParserMessage
  	if p.parser.nwarn > 0 {
  		nwarn := int(p.parser.nwarn)
  		warnings = make([]*ParserMessage, nwarn)
  		for i := 0; i < nwarn; i++ {
  			msg := p.parser.warn_buffer[i]
  
  			warnings[i] = &ParserMessage{
  				Col:     int(msg.column),
  				Line:    int(msg.lineno),
  				Message: C.GoString(msg.message),
  			}
  		}
  	}
  
  	if p.parser.nerr > 0 {
  		nerr := int(p.parser.nerr)
  		errors := make([]*ParserMessage, nerr)
  		for i := 0; i < nerr; i++ {
  			msg := p.parser.error_buffer[i]
  
  			errors[i] = &ParserMessage{
  				Col:     int(msg.column),
  				Line:    int(msg.lineno),
  				Message: C.GoString(msg.message),
  			}
  		}
  
  		return warnings, &ParserError{Errors: errors}
  	}
  
  	return warnings, nil
  }
docs: // Parse parses the code in the given context, and returns any warnings
  // or errors from parsing.
  //
  // The CompileContext can be nil to not set a context.